Skapa deterministiska paket

Från och med .NET 11 är NuGet-paket deterministiska (eller reproducerbara) som standard.

Det innebär att återskapa samma paket bör generera en identisk nupkg-fil.

Den enda kända varning är ändringstiden för filer. NuGet-paket innehåller olika filer. Tidsstämpeln för filändring på dessa filer baseras på tidsstämpeln för de ursprungliga filerna på disken, vilket kan ändras på grund av flera orsaker även om filinnehållet annars är identiskt.

Om du vill skapa lite identiska NuGet-paket kan du ange DeterministicTimestamp egenskapen till ett känt/fast värde. Om du vill återskapa ett befintligt paket kan du hitta värdet DeterministicTimestamp som används av den versionen och skicka det till en ny version som du vill göra.

Den välkända SOURCE_DATE_EPOCH miljövariabeln kan ställas in för att aktivera samma beteende som inställningen DeterministicTimestamp.

Skapa deterministiska paket

Att kompilera i deterministiskt läge är standard från och med .NET 11.

  • Använd kommandoraden:

    dotnet pack
    

Om du vill ange tiden baserat på incheckningstiden för den senaste Git-incheckningen kan du använda något liknande:

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

Då anges miljövariabeln DeterministicTimestamp till tidsstämpeln git commit, som msbuild automatiskt använder. Att återskapa paketet handlar sedan om att köra samma kommandouppsättning igen.

Återskapa ett paket

Om du vill återskapa ett lite identiskt paket tar du reda på värdet DeterministicTimestamp som användes i den första versionen och använder det sedan igen:

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

Inaktivera fasta tidsstämplar

Om du vill behålla de ursprungliga tidsstämplarna för filändring i dina NuGet-paket kan du ange DeterministicTimestamp till false.

  • Använd kommandoraden:

    dotnet pack -p:DeterministicTimestamp=false
    
  • Använda filen .csproj:

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