決定論的パッケージのビルド

.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 パッケージに保持する場合は、 DeterministicTimestampfalse に設定できます。

  • コマンド ラインの使用:

    dotnet pack -p:DeterministicTimestamp=false
    
  • .csproj ファイルの使用:

    <PropertyGroup>
        <DeterministicTimestamp>false</DeterministicTimestamp>
    </PropertyGroup>