Referensi penerapan versi
Penerapan versi memungkinkan Anda mengontrol revisi dependensi yang tepat secara deterministik yang digunakan oleh proyek Anda dari dalam file manifes Anda. Penerapan versi hanya tersedia untuk mode manifes pengguna.
Untuk informasi selengkapnya tentang algoritma penerapan versi vcpkg dan konsep tingkat tinggi, lihat Konsep Penerapan Versi .
Misalnya dengan konteks, lihat panduan kami untuk memulai penerapan versi.
Skema Versi
Port di vcpkg harus mencoba mengikuti konvensi penerapan versi yang digunakan oleh penulis paket. Untuk alasan itu, saat mendeklarasikan versi paket, skema yang sesuai harus digunakan.
Setiap skema penerapan versi mendefinisikan aturannya sendiri tentang apa itu string versi yang valid dan yang lebih penting aturan tentang cara mengurutkan versi menggunakan skema yang sama.
Skema penerapan versi yang dipahami oleh vcpkg adalah:
Properti manifes | Skema penerapan versi |
---|---|
version |
Untuk versi numerik yang dipisahkan titik |
version-semver |
Untuk versi yang sesuai dengan SemVer |
version-date |
Untuk tanggal dalam format YYYY-MM-DD |
version-string |
Untuk string arbitrer |
Manifes hanya boleh berisi satu deklarasi versi.
Nota
Secara desain, vcpkg tidak membandingkan versi yang menggunakan skema yang berbeda. Misalnya, paket yang memiliki version-string: 7.1.3
tidak dapat dibandingkan dengan paket yang sama menggunakan version: 7.1.4
, bahkan jika konversi tampak jelas.
version
Menerima string versi yang mengikuti skema santai, dipisahkan-titik, seperti semver.
Versi ini secara logis terdiri dari bagian numerik yang dipisahkan titik (.
). Setiap bagian harus berisi bilangan bulat positif tanpa nol di depannya.
Pola regex untuk skema penerapan versi ini adalah: (0|[1-9]\d*)(\.(0|[1-9]\d*))*
Perilaku pengurutan: Saat membandingkan dua versi, setiap bagian dibandingkan dari kiri ke kanan dengan nilai numeriknya, hingga perbedaan pertama ditemukan. Versi dengan set bagian terkecil lebih diutamakan daripada yang lain dengan sekumpulan bagian yang lebih besar, mengingat bahwa semua bagian sebelumnya dibandingkan secara merata.
Contoh:
0
< 0.1
< 0.1.0
< 1
< 1.0.0
< 1.0.1
< 1.1
< 2.0.0
version-semver
Menerima string versi yang mengikuti konvensi penerapan versi semantik seperti yang dijelaskan dalam spesifikasi penerapan versi semantik .
Mengurutkan perilaku: String diurutkan mengikuti aturan yang dijelaskan dalam spesifikasi penerapan versi semantik.
Contoh:
1.0.0-1
< 1.0.0-alpha
< 1.0.0-beta
< 1.0.0
< 1.0.1
< 1.1.0
version-date
Menerima string versi yang dapat diurai ke tanggal setelah format ISO-8601 YYYY-MM-DD
. Pengidentifikasi disambiguasi diizinkan dalam bentuk angka bilangan bulat yang dipisahkan titik, positif, dan bilangan bulat tanpa nol di depannya.
Ini adalah skema penerapan versi yang direkomendasikan untuk pustaka "Live at HEAD" yang tidak memiliki versi rilis yang dibuat.
Pola regex untuk skema penerapan versi ini adalah: \d{4}-\d{2}-\d{2}(\.(0|[1-9]\d*))*
Perilaku pengurutan: String diurutkan terlebih dahulu menurut bagian tanggalnya, lalu berdasarkan perbandingan numerik pengidentifikasi disambiguasi mereka. Pengidentifikasi disambiguasi mengikuti aturan skema santai (version
).
Contoh: 2021-01-01
<2021-01-01.1
<2021-02-01.1.2
<2021-02-01.1.3
<2021-02-01
version-string
Untuk paket yang menggunakan string versi yang tidak sesuai dengan skema lain, paket menerima sebagian besar string arbitrer.
#
yang digunakan untuk menunjukkan versi port tidak diizinkan.
Perilaku pengurutan: Tidak ada pengurutan yang dicoba pada string versi itu sendiri. Namun, jika string cocok persis, versi portnya dapat dibandingkan dan diurutkan.
Contoh:
apple
<>orange
<>orange.2
<>orange2
watermelon#0
<watermelon#1
port-version
Versi port melacak perubahan dalam file kemasan (vcpkg.json
, portfile.cmake
, dll) tanpa perubahan pada versi pustaka upstram.
Versi port adalah nilai bilangan bulat non-negatif.
Aturan untuk versi port adalah:
- Mulai dari 0 untuk versi asli port,
- meningkat 1 setiap kali perubahan khusus vcpkg dilakukan pada port yang tidak meningkatkan versi paket,
- dan reset ke 0 setiap kali versi paket diperbarui.
Nota
vcpkg mengikuti format teks <version>#<port version>
. Misalnya 1.2.0#2
berarti versi 1.2.0
versi port 2
. Jika versi port 0
akhiran #0
dihilangkan (misalnya, 1.2.0
menyiratkan versi 1.2.0
versi port 0
).
Mengurutkan perilaku: Jika dua versi dibandingkan secara merata, versi portnya dibandingkan dengan nilai numeriknya, versi port yang lebih rendah lebih diutamakan.
Contoh:
1.2.0
<1.2.0#1
<1.2.0#2
<1.2.0#10
2021-01-01#20
<2021-01-01.1
windows#7
<windows#8
Batasan Versi
Garis besar
Garis besar menentukan lantai versi global untuk versi apa yang akan dipertimbangkan (kecuali ditentukan di tempat lain, versi yang terkait dengan garis besar tersebut akan digunakan). Ini memungkinkan manifes tingkat atas untuk menyimpan seluruh grafik dependensi up-to-date tanpa perlu menentukan batasan "version>="
langsung secara individual.
Setiap registri yang dikonfigurasi memiliki garis besar terkait. Untuk manifes yang tidak mengonfigurasi registri apa pun, bidang "builtin-baseline"
menentukan garis besar untuk registri bawaan. Jika manifes tidak mengonfigurasi registri apa pun dan tidak memiliki "builtin-baseline"
, instalasi beroperasi sesuai dengan algoritma mode Klasik dan mengabaikan semua informasi penerapan versi.
Garis besar, seperti pengaturan registri lainnya, diabaikan dari port yang digunakan sebagai dependensi. Jika versi minimum diperlukan selama resolusi versi transitif, port harus menggunakan "version>="
.
Contoh
{
"name": "project",
"version": "1.0.0",
"dependencies": ["zlib", "fmt"],
"builtin-baseline":"9fd3bd594f41afb8747e20f6ac9619f26f333cbe"
}
Untuk menambahkan "builtin-baseline"
awal, gunakan vcpkg x-update-baseline --add-initial-baseline
. Untuk memperbarui garis besar dalam manifes, gunakan vcpkg x-update-baseline
.
version>=
Mengekspresikan persyaratan versi minimum, version>=
deklarasi menempatkan batas yang lebih rendah pada versi yang dapat digunakan untuk memenuhi dependensi.
Nota
vcpkg memilih versi terendah yang cocok dengan semua batasan, sehingga batasan yang kurang dari tidak diperlukan.
Contoh:
{
"name": "project",
"version-semver": "1.0.0",
"dependencies": [
{ "name": "zlib", "version>=": "1.2.11#9" },
{ "name": "fmt", "version>=": "7.1.3#1" }
],
"builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Sebagai bagian dari deklarasi batasan versi, versi port dapat ditentukan dengan menambahkan akhiran #<port-version>
, dalam contoh sebelumnya 1.2.11#9
mengacu pada versi 1.2.11
versi port 9
.
overrides
Menyatakan penimpaan memaksa vcpkg untuk mengabaikan semua batasan versi lainnya dan menggunakan versi yang ditentukan dalam penimpaan. Ini berguna untuk menyematkan versi yang tepat dan untuk menyelesaikan konflik versi.
Penimpaan dinyatakan sebagai array deklarasi versi paket.
Agar penimpaan berlaku, paket yang ditimpa harus membentuk bagian dari grafik dependensi. Itu berarti bahwa dependensi harus dideklarasikan baik oleh manifes tingkat atas atau menjadi bagian dari dependensi transitif.
Hanya satu penimpaan yang dapat dideklarasikan untuk nama tertentu.
{
"name": "project",
"version-semver": "1.0.0",
"dependencies": [
"curl",
{ "name": "zlib", "version>=": "1.2.11#9" },
"fmt"
],
"builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{ "name": "fmt", "version": "6.0.0" },
{ "name": "openssl", "version": "1.1.1h#3" }
]
}