被問到冷門問題:使用 dotnet publish 發佈 ASP.NET Core 專案時有些會產生 refs 跟 runtimes 目錄有些不會,這兩個資料夾是做什麼用的?

好問題。這部分一直被我當成黑盒子,沒想過深入了解,評估屬於不知道也不會死的等級,但既然遇上了就當成天意,趁此機會搞清楚補充知識。

難得本草網目有個專頁說明 ASP.NET Core 目錄架構,但裡面沒提到 refs 及 runtimes 的事。最後,我在官方部落格文章 .NET Core 2.1 Update strategy 查到說明,雖是 ASP.NET Core 2.0 年代的文章,但概念相同。

例如:dotnet new mvc 建立空白 MVC 專案,起初 publish 下只有 wwwroot 資料夾。

但在參照特定程式庫及修改設定後,便會生出 runtimes 資料夾及 refs 資料夾。

runtimes 會在 NuGet 套件包含原生資產(作業系統/架構特定)時產生,其下會依作業系統或架構分資料夾,例如 Microsoft.Data.SqlClient 在不同平台有不同版本,有時還需要額外的 Unmanaged 程式庫 Microsoft.Data.SqliClient.SNI.dll。

refs 則在啟用動態 .cshtml 編譯時出現,裡面擺放執行階段編譯 Razor View 需要的組件,做法是 dotnet add package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation,並在 .csproj 加入 RazorCompileOnPublish 屬性設成 false。參考,之後 publish 會包含 Views 資料夾及 .cshtml 檔,refs 資料夾則會有幾乎全套 Microsoft.*、System.* 組件,以便在瀏覽到 View 時動態編譯 .cshtml。

再補充一些冷知識。

Explain the purpose of the refs and runtimes folders in the ASP.NET Core publish folder.


Comments

Be the first to post a comment

Post a comment