Vytváření deterministických balíčků

Počínaje .NET 11 jsou balíčky NuGet ve výchozím nastavení deterministické (nebo reprodukovatelné).

To znamená, že opětovné sestavení stejného balíčku by mělo vygenerovat stejný soubor nupkg.

Jedním známým upozorněním je čas úprav souborů. Balíčky NuGet obsahují různé soubory. Časové razítko změny souboru na těchto souborech je založeno na časovém razítku původních souborů na disku, které se může změnit z několika důvodů, i když je obsah souboru jinak stejný.

Pokud chcete vytvořit identické balíčky NuGet, můžete vlastnost nastavit DeterministicTimestamp na známou/pevnou hodnotu. Pokud chcete reprodukovat existující balíček, můžete najít hodnotu DeterministicTimestamp používanou tímto sestavením a předat ji do nového sestavení, které chcete provést.

Známou SOURCE_DATE_EPOCH proměnnou prostředí lze nastavit tak, aby aktivoval stejné chování jako nastavení DeterministicTimestamp.

Vytváření deterministických balíčků

Sestavení v deterministickém režimu je výchozím nastavením počínaje .NET 11.

  • Pomocí příkazového řádku:

    dotnet pack
    

Pokud chcete nastavit čas na základě času potvrzení posledního potvrzení Gitu, můžete použít něco takového:

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

Tím se proměnná prostředí s názvem DeterministicTimestamp nastaví na časové razítko commitu v Gitu, které nástroj msbuild automaticky použije. Reprodukcí balíčku je pak otázkou opětovného spuštění stejné sady příkazů.

Reprodukování balíčku

Pokud chcete reprodukovat bitově identický balíček, zjistěte DeterministicTimestamp hodnotu použitou v prvním sestavení a pak ho znovu použijte:

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

Zakázání pevných časových razítek

Pokud chcete v balíčcích NuGet zachovat původní časová razítka úprav souborů, můžete nastavit DeterministicTimestamp na false.

  • Pomocí příkazového řádku:

    dotnet pack -p:DeterministicTimestamp=false
    
  • Použití souboru .csproj:

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