【笨問題】防止 .NET 編譯產生不需要的多語系資源檔
7 |
針對需要支援多語系的場合,.NET 標準做法是為各語系建立專屬資源檔,放入該語系的文字翻譯、專用圖示,Visual Studio 會將這些資源檔編譯成衛星組件(Satellite Assembly)。如此,執行時可依環境彈性載入,有專屬資源就用,沒有就用英文;開發時也可依需求逐步增加新語系,很方便。
但我一直有個困擾,當專案使用到支援多語系元件時,編譯資料夾就會生出一堆語系名稱資料夾,但我的網站沒有要服務歪果仁啊,冒出這麼多用不到的東西令人心煩。
之前遇到,我都很認命地手動刪檔,但想想不對,這太笨了,不像 .NET 的風格,應該有官方解法。
Yes! 在 .csproj 加上 SatelliteResourceLanguages,設定要包含的語系,這樣就行了! 可惡,我為什麼得過且過拖了這麼久?
Tips of how to prevent unnecessary resource files by SatelliteResourceLanguages setting.
Comments
# by 小雞
結果還是有en? 是預設得有的嗎
# by Jeffrey
to 小雞,程式庫預設語系一般是英文,大多不需要額外資源 dll,但如果程式將英文也拆出來放資源檔,就會出現 en 資料夾。
# by Soon
黑大不好意思回舊文; 想請問有沒有遇過前端的檔案 (/wwwroot/ooo/ooo/ooo.xxx.zh-tw.js) 也會影響到 dotnet publish 結果也包含了一堆語系資料夾 (大小寫也吻合,若將 .js 改為 zh-TW 產生資料夾名稱也會跟著變) 還是說 publish 過程它會去掃描整個專案下所有疑似 culture resource 檔名是正常行為嗎 (不限前後端) ?找不太到 dotnet publish / mabuild 是否有相關自動搜索機制的文件 環境是 .Net7 asp.net core 專案在 linux container 執行 謝謝🙏
# by Jeffrey
to Soon, 你的意思是原本 wwwroot 下沒有這些 xxx.zh-tw.js,但 publish 時後卻會自己冒出來?莫非有掛載某些前端的編譯或打包工具?
# by Soon
報告黑大:是反過來,原本 publish 出來的 Culture 資料夾沒有那麼多,但在加入一些前端套件後變多了(我們正在進行一些既有專案的合併)。 經過一些消去法測試發現,這些多出來的資料夾跟加了那些前端 .js 有關聯。但還找不到 dotnet publish 是不是會有類似「掃描全專案檔名,發現特定 pattern 就產生該語系資料夾」這種行為的線索
# by Jeffrey
to Soon, 若能用消去法,我想到的調查方向是抓出從加入哪個前端套件後開始產出 Culture 資料夾(每做一步 git commit 一次),用 git diff 比較被加了哪些檔案,兇手就在裡面。
# by Soon
報告黑大:暫時算階段性破案了,因為 .csproj 被加了一行 <EmbeddedResource Include="wwwroot\**\*.*" /> 導致 build 時會自動找出 wwwroot 下所有檔名符合 ooo.{valid-culture-id}.xxx 的檔案 進而產生 /bin/Debug/net8.0/{valid-culture-id}/{project-name}.resources.dll 這些 Satellite Assemblies 可以加一個 WithCulture 停用這個行為 <EmbeddedResource Include="wwwroot\**\*.*" WithCulture="false" /> 感謝~