NuGet package 的 Health Status

使用 NuGet Explorer 來檢查一個 NuGet Package 的時候會發現有一個 NuGet Health Status 的區段,那要怎麼讓我們做出的 NuGet Package 都是綠燈呢?

使用 NuGetPackageExplorer 去檢視 nupkg 的資訊時,可以發現裡面有一個 Health 的區段,一共有四個項目

  • Signature
  • Source Link
  • Deterministic (dll/exe)
  • Compiler Flags
圖片來源:https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/blob/main/images/screenshots/PackageView.png?raw=true
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 設定為 portableembedded  (根據看 NuGetPackageExplorer 裡面的邏輯才比較確定的)

DebugType 官方文件:DebugType 可以用 Visual Studio 修改或直接改 project 檔案

SDK-Style 的 project 檔案預設是 portable

Reference