Erstellen von deterministischen Paketen

Ab .NET 11 sind NuGet-Pakete standardmäßig deterministisch (oder reproduzierbar).

Dies bedeutet, dass beim Neuerstellen desselben Pakets eine identische nupkg-Datei generiert werden soll.

Die einzige bekannte Einschränkung ist die Änderungszeit für Dateien. NuGet-Pakete enthalten verschiedene Dateien. Der Zeitstempel der Dateiänderung auf diesen Dateien basiert auf dem Zeitstempel der ursprünglichen Dateien auf dem Datenträger, was sich aus mehreren Gründen ändern kann, auch wenn der Dateiinhalt andernfalls identisch ist.

Um Bit-identische NuGet-Pakete zu erstellen, können Sie die DeterministicTimestamp Eigenschaft auf einen bekannten/festen Wert festlegen. Um ein vorhandenes Paket zu reproduzieren, finden Sie den von diesem Build verwendeten DeterministicTimestamp-Wert und übergeben ihn an einen neuen Build, den Sie ausführen möchten.

Die bekannte SOURCE_DATE_EPOCH Umgebungsvariable kann so festgelegt werden, dass das gleiche Verhalten wie die Einstellung DeterministicTimestampaktiviert wird.

Erstellen von deterministischen Paketen

Das Erstellen im deterministischen Modus ist die Standardeinstellung beginnend mit .NET 11.

  • Verwenden Sie die Befehlszeile:

    dotnet pack
    

Wenn Sie die Zeit basierend auf der Commit-Zeit des neuesten Git-Commits festlegen möchten, können Sie etwas wie folgt verwenden:

export DeterministicTimestamp=$(git log -1 --pretty=%ct)
echo $DeterministicTimestamp
dotnet pack

Dadurch wird die Umgebungsvariable "DeterministicTimestamp" auf den Git-Commit-Zeitstempel festgelegt, den msbuild automatisch verwendet. Die Wiedergabe des Pakets ist dann eine Frage der erneuten Ausführung desselben Befehlssatzes.

Reproduzieren eines Pakets

Wenn Sie ein bitidentisches Paket reproduzieren möchten, ermitteln Sie den beim ersten Build verwendeten DeterministicTimestampWert und verwenden Sie ihn dann erneut:

dotnet pack -p:DeterministicTimestamp=<value from previous build>

Deaktivieren von festen Zeitstempeln

Wenn Sie die ursprünglichen Zeitstempel für die Dateiänderung in Ihren NuGet-Paketen beibehalten möchten, können Sie auf .DeterministicTimestamp festlegenfalse.

  • Verwenden Sie die Befehlszeile:

    dotnet pack -p:DeterministicTimestamp=false
    
  • Verwenden der .csproj Datei:

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