使用 NuGet Explorer 來檢查一個 NuGet Package 的時候會發現有一個 NuGet Health Status 的區段,那要怎麼讓我們做出的 NuGet Package 都是綠燈呢?
使用 NuGetPackageExplorer 去檢視 nupkg 的資訊時,可以發現裡面有一個 Health 的區段,一共有四個項目
- Signature
- Source Link
- Deterministic (dll/exe)
- Compiler Flags
NuGetPackageExplorer 驗證 package 的程式碼在 : SymbolValidator.cs
若沒有簽章的話,會忽略 Signature 的檢查,如果要嚴謹的面對 NuGet 的話可以研究如何去 Sign package,本文不針對 Sign 只針對其他三項要過關的方式說明
Source Link
- 把 Symbol 檔案放入 nuget 中,意思就是要把 PDB 放入能夠被找到
- 能夠被找到的方式有 2 種
1. 把 PDB 檔案包入 NuGet package 中
2. 直接把 PDB 嵌入在 嵌入在 dll/exe 中
- PDB 的設定對應到 Visual Studio 開啟 project 的屬性是 Debug symbols,對應在 Project 檔案中的 <DebugType> tag
- 手動在 Project 檔案加入下面的幾個 tag
<!-- Publish the repository URL in the built .nupkg (in the NuSpec <Repository> element) -->
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<!-- Embed source files that are not tracked by the source control manager in the PDB -->
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<!-- Include PDB files in NuGet package (If you set DebugType as embedded then this setting will do nothing)-->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
- 安裝對應的 SourceLink Nuget Package
備註
除了把 PDB 直接包入 nuget pakcage 或 嵌入在 dll/exe 中的方式,還可以把 symbol 檔案當成 package (.snupkg)上傳到 Artifactory server (e.g. nuget.org)
可以參考:Creating symbol packages (.snupkg)
Deterministic (dll/exe)
修改 Project 檔案,讓在 CI 環境下的 build 會加入 <ContinuousIntegrationBuild> 的 tag 並設定為 true,
換句話說,local build 的話 Deterministic 的檢查就不會通過
以 Gibhub 為例子
<PropertyGroup Condition="'$(GITHUB_ACTIONS)' == 'true'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
以 Bitbucket 為例子
<PropertyGroup Condition="'$(bamboo_buildNumber)' != ''">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
Compiler Flags
需要將 Debug Type 設定為 portable 或 embedded (根據看 NuGetPackageExplorer 裡面的邏輯才比較確定的)
DebugType 官方文件:DebugType 可以用 Visual Studio 修改或直接改 project 檔案