.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>