從 .NET 11 開始,NuGet 套件預設為確定性(或可重現)。
這表示重建同一個套件應該會產生相同的 nupkg 檔案。
唯一已知的限制是檔案的修改時間。 NuGet 套件包含各種檔案。 這些檔案的修改時間戳記是根據磁碟上原始檔案的時間戳記而定,即使檔案內容完全相同,時間戳也可能因多種原因而改變。
要做出位元相同的 NuGet 套件,你可以將屬性設定 DeterministicTimestamp 為已知/固定值。 若要重現現有的套件,你可以找出該建置所使用的 DeterministicTimestamp 值,然後將它傳遞給你要執行的新建置。
眾所周知 SOURCE_DATE_EPOCH 的環境變數可以設定為啟動與設定 DeterministicTimestamp相同的行為。
建構確定性套件
從 .NET 11 開始預設以確定性模式建構。
使用命令列:
dotnet pack
如果你想根據最新 Git 提交的時間設定時間,可以用類似這樣的方法:
export DeterministicTimestamp=$(git log -1 --pretty=%ct)
echo $DeterministicTimestamp
dotnet pack
這會將名為 DeterministicTimestamp 的環境變數設為 git 提交時間戳,msbuild 會自動使用這個時間戳。 重現套件後只需再次執行同一組指令即可。
複製套件
如果你想重現位元完全相同的套件,請先找出第一次建置時所使用的 DeterministicTimestamp 值,然後再次使用該值:
dotnet pack -p:DeterministicTimestamp=<value from previous build>
停用固定時間戳
如果你想保留原始檔案修改時間戳記在 NuGet 套件中,可以設定 DeterministicTimestamp 為 false。
使用命令列:
dotnet pack -p:DeterministicTimestamp=false使用該
.csproj檔案:<PropertyGroup> <DeterministicTimestamp>false</DeterministicTimestamp> </PropertyGroup>