將 ASP.NET MVC 專案翻寫為 ASP.NET Core 的過程,我想沿用 .config appSetting 縮小修改幅度。好消息是微軟有提供 System.Configuration.ConfigurationManager NuGet Package 讓 .NET Standard 2.0 與 .NET Core 繼續透過 ConfigurationManager.AppSettings[...] 從 .dll.config、.exe.config 或 web.config 讀取設定。(註:是否應摒棄靜態類別及改用新一代的 appsettings.json 是個見仁見智的問題,這裡繼續擱置爭議)

但我遇到一個問題,在 ASP.NET Core 網站根目錄放了 app.config,dotnet publish -c Release 發佈時也順利轉換成 web-app-name.dll.config,但 app.config 也一併被輸出到 Output 與 Publish 目錄:

摸了一陣子才搞清楚要怎麼排除,做法很簡單,在 .csproj 加一筆:

<ItemGroup>
    <Content Update="app.config" CopyToOutputDirectory="Never" 
             CopyToPublishDirectory="Never" />
</ItemGroup>

為什麼不是 Content Include 而是 Content Update?

大家應該有發現,從 .NET Core 起,.csproj 不需像 .NET Framework 的 .csproj 要逐一列舉所有專案包含檔案,它會自動將目錄下的檔案納入,省事許多。由於系統已隱含專案項目,故寫成 Content Include 將引發以下 Content 重複錯誤:

error NETSDK1022: Duplicate 'Content' items were included. The .NET SDK includes 'Content' items from your project directory by default. You can either remove these items from your project file, or set the 'EnableDefaultContentItems' property to 'false' if you want to explicitly include them in your project file. For more information, see https://aka.ms/sdkimplicititems.

依據官方文件,每個 .NET Core 及 .NET 5+ 專案會關聯到 Project SDK (亦即 .csproj 第一行所註明的 SDK,如 <Project Sdk="Microsoft.NET.Sdk.Web">)

.NET SDK 預設包含或排除項目的規則如下:(不同 SDK 有其專屬項目,例如:Microsoft.NET.Sdk.Web 會涵蓋 web.config、.json、.cshtml、wwwroot... 等 參考)

  • Compile Include="**/*.cs"
  • Embedded Include="**/*.resx"
  • None Include="**/*"
  • 排除 **/*.user、**/*.*proj、**/*.sln、**/*.vssscc、./bin、./obj

系統未包含的項目我們可自行補上 Content 或 Embedded,此時可用 Include 指定路徑;但若該項目已被 .NET SDK 包含,要移除可以寫成 Content Remove="路徑",若要更新 CopyToOutputDirectory、CopyToPublishDirectory 等設定,則可寫成 Content Update="路徑" SomeAttribute="..." 覆寫設定值。

又學到一些 .NET 小知識。

Introduce to the .NET SDK default includes and excludes and how to add/remove/update project items.


Comments

Be the first to post a comment

Post a comment