Deterministik paketler oluşturma

.NET 11'den başlayarak NuGet paketleri varsayılan olarak belirlenimcidir (veya yeniden üretilebilir).

Bu, aynı paketin yeniden oluşturulmasının aynı nupkg dosyası oluşturması gerektiği anlamına gelir.

Bilinen bir uyarı, dosyalardaki değişiklik süresidir. NuGet paketleri çeşitli dosyalar içerir. Bu dosyalardaki dosya değişikliği zaman damgası, disk üzerindeki özgün dosyaların zaman damgasını temel alır ve bu, dosya içeriği aksi takdirde aynı olsa bile çeşitli nedenlerden dolayı değişebilir.

Bit düzeyinde özdeş NuGet paketleri oluşturmak için DeterministicTimestamp özelliğini bilinen/sabit bir değere ayarlayabilirsiniz. Mevcut bir paketi yeniden oluşturmak için, bu derleme tarafından kullanılan DeterministicTimestamp değerini bulabilir ve bunu yapmak istediğiniz yeni bir derlemeye geçirebilirsiniz.

İyi bilinen SOURCE_DATE_EPOCH ortam değişkeni, ayarıyla DeterministicTimestampaynı davranışı etkinleştirmek için ayarlanabilir.

Deterministik paketler oluşturma

.NET 11'den başlayarak, belirleyici modda derleme varsayılandır.

  • Komut satırını kullanarak:

    dotnet pack
    

Zamanı en son Git işlemesinin işleme süresine göre ayarlamak istiyorsanız, aşağıdaki gibi bir şey kullanabilirsiniz:

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

Bu, DeterministicTimestamp adlı ortam değişkenini, msbuild'in otomatik olarak kullanacağı git işleme zaman damgasına ayarlar. Paketin yeniden üretilmesi, aynı komut kümesinin yeniden çalıştırılmasıyla ilgili bir işlemdir.

Paketi yeniden oluşturma

Bit düzeyinde özdeş bir paketi yeniden oluşturmak istiyorsanız, ilk derlemede kullanılan DeterministicTimestamp değerin ne olduğunu bulun ve ardından aynı değeri tekrar kullanın:

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

Sabit zaman damgalarını devre dışı bırakma

NuGet paketlerinizde orijinal dosya değiştirme zaman damgalarını korumak istiyorsanız, DeterministicTimestamp değerini false olarak ayarlayabilirsiniz.

  • Komut satırını kullanarak:

    dotnet pack -p:DeterministicTimestamp=false
    
  • .csproj dosyasını kullanma:

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