Membangun paket deterministik

Mulai dari .NET 11, paket NuGet bersifat deterministik (atau dapat direproduksi) secara default.

Itu berarti membangun kembali paket yang sama harus menghasilkan file nupkg yang identik.

Satu-satunya kendala yang diketahui adalah waktu modifikasi pada berkas. Paket NuGet berisi berbagai file. Tanda waktu modifikasi file pada file tersebut didasarkan pada tanda waktu file asli pada disk, yang dapat berubah karena beberapa alasan bahkan jika konten file identik.

Untuk membuat paket NuGet yang identik bit, Anda dapat mengatur DeterministicTimestamp properti ke nilai yang diketahui/tetap. Untuk mereprodusi paket yang ada, Anda dapat menemukan nilai DeterministicTimestamp yang digunakan oleh build tersebut dan meneruskannya ke build baru yang ingin Anda lakukan.

Variabel lingkungan terkenal SOURCE_DATE_EPOCH dapat diatur untuk mengaktifkan perilaku yang sama dengan pengaturan DeterministicTimestamp.

Membangun paket deterministik

Membangun dalam mode deterministik adalah default yang dimulai dengan .NET 11.

  • Menggunakan baris perintah:

    dotnet pack
    

Jika Anda ingin mengatur waktu berdasarkan waktu penerapan penerapan Git terbaru, Anda dapat menggunakan sesuatu seperti ini:

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

Ini akan mengatur variabel lingkungan bernama DeterministicTimestamp ke tanda waktu penerapan git, yang akan digunakan msbuild secara otomatis. Membuat ulang paket tersebut selanjutnya hanya perlu menjalankan rangkaian perintah yang sama lagi.

Membuat ulang paket

Jika Anda ingin mereprodurasi paket yang sedikit identik, cari tahu nilai yang DeterministicTimestamp digunakan dalam build pertama lalu gunakan lagi:

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

Menonaktifkan tanda waktu tetap

Jika Anda ingin menyimpan tanda waktu modifikasi file asli dalam paket NuGet Anda, Anda dapat mengatur DeterministicTimestamp ke false.

  • Menggunakan baris perintah:

    dotnet pack -p:DeterministicTimestamp=false
    
  • .csproj Menggunakan file:

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