Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penerapan versi minimum
vcpkg menggunakan pendekatan pemilihan minimal untuk penerapan versi, terinspirasi oleh yang digunakan oleh Go, tetapi dimodifikasi dalam beberapa cara:
- Selalu dimulai dari penginstalan baru, menghilangkan kebutuhan akan operasi peningkatan/penurunan tingkat.
- Izinkan dependensi yang tidak dibatasi dengan memperkenalkan garis besar.
Namun, prinsip pemilihan minimal tetap sama. Mengingat serangkaian batasan, vcpkg akan menggunakan versi paket "terlama" yang mungkin yang dapat memenuhi semua batasan.
Menggunakan pendekatan versi minimum memiliki keuntungan berikut:
- Ini dapat diprediksi dan mudah dipahami.
- Kontrol pengguna saat peningkatan terjadi, seperti dalam, tidak ada peningkatan yang dilakukan secara otomatis saat versi baru dirilis.
- Menghindari penggunaan pemecah SAT.
Untuk memberikan contoh, pertimbangkan grafik paket berikut:
(A 1.0) -> (B 1.0)
(A 1.1) -> (B 1.0)
-> (C 3.0)
(A 1.2) -> (B 2.0)
-> (C 3.0)
(C 2.0)
Dan manifes berikut:
{
"name": "example",
"version": "1.0.0",
"dependencies": [
{ "name": "A", "version>=": "1.1" },
{ "name": "C", "version>=": "2.0" }
],
"builtin-baseline": "<some git commit with A's baseline at 1.0>"
}
Setelah memperhitungkan dependensi transitif, kami memiliki serangkaian batasan berikut:
- A >= 1.1
- B >= 1,0
- C >= 3.0
- C >= 2.0
Karena vcpkg harus memenuhi semua batasan, set paket yang diinstal menjadi:
-
A 1.1, bahkan ketikaA 1.2ada, tidak ada batasan yang lebih tinggi dari1.1sehingga vcpkg memilih versi minimum yang mungkin. -
B 1.0, secara transitif diperlukan olehA 1.1. -
C 3.0, ditingkatkan oleh batasan transitif yang ditambahkan olehA 1.1untuk memenuhi batasan versi.
Resolusi batasan
Mengingat manifes dengan sekumpulan dependensi versi, vcpkg akan mencoba menghitung rencana penginstalan paket yang memenuhi semua batasan.
Batasan versi hadir dalam rasa berikut:
-
Batasan yang dinyatakan: Batasan dinyatakan secara eksplisit dalam manifes tingkat atas menggunakan
version>=. -
Batasan garis besar: Batasan ditambahkan secara implisit oleh
builtin-baseline. - Batasan transitif: Batasan yang ditambahkan secara tidak langsung oleh dependensi dependensi Anda.
-
Penimpaan batasan: Batasan ditimpa dalam manifes tingkat atas menggunakan
overridesdeklarasi.
Untuk menghitung rencana penginstalan, vcpkg mengikuti kira-kira langkah-langkah berikut:
- Tambahkan semua batasan tingkat atas ke paket.
- Tambahkan batasan transitif secara rekursif ke paket.
- Setiap kali paket baru ditambahkan ke paket, tambahkan juga batasan garis besarnya ke paket.
- Setiap kali batasan ditambahkan:
- Jika ada penimpaan untuk paket
- Pilih versi dalam penimpaan.
- Sebaliknya:
- Jika tidak ada versi sebelumnya yang dipilih.
- Pilih versi minimal yang memenuhi batasan.
- Jika ada versi sebelumnya yang dipilih:
- Jika skema penerapan versi batasan baru tidak cocok dengan versi yang dipilih sebelumnya:
- Tambahkan konflik versi.
- Jika versi batasan tidak sebanding dengan versi yang dipilih sebelumnya. Misalnya, membandingkan "version-string: apple" dengan "version-string: orange":
- Tambahkan konflik versi.
- Jika versi batasan lebih tinggi dari versi yang dipilih sebelumnya:
- Pilih versi tertinggi.
- Sebaliknya:
- Pertahankan pilihan sebelumnya.
- Jika skema penerapan versi batasan baru tidak cocok dengan versi yang dipilih sebelumnya:
- Jika tidak ada versi sebelumnya yang dipilih.
- Tinjau paket:
- Jika tidak ada konflik
- Menginstal paket terpilih
- Sebaliknya:
- Melaporkan konflik kepada pengguna
- Jika tidak ada konflik
Memperoleh versi port
Meskipun konsep versi paket selalu ada di vcpkg, konsep batasan versi belum.
Dengan pengenalan batasan penerapan versi, sekarang ada kemungkinan bahwa paket tergantung pada versi port yang tidak cocok dengan yang tersedia secara lokal. Ini menimbulkan masalah karena vcpkg perlu mengetahui cara memperoleh file port untuk versi yang diminta.
Untuk mengatasi masalah ini, sekumpulan file metadata baru diperkenalkan. File-file ini terletak di versions/ direktori di tingkat akar repositori vcpkg.
versions/ Direktori, akan berisi file JSON untuk masing-masing port yang tersedia di registri. Setiap file akan mencantumkan semua versi yang tersedia untuk paket dan berisi objek git tree-ish yang dapat dicek keluar vcpkg untuk mendapatkan portfiles versi tersebut.
Contoh: zlib.json
{
"versions": [
{
"git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
"version-string": "1.2.11",
"port-version": 9
},
...
{
"git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
"version-string": "1.2.10",
"port-version": 0
},
{
"git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
"version-string": "1.2.8",
"port-version": 0
}
]
}
Untuk setiap port, file versi yang sesuai harus terletak di versions/{first letter of port name}-/{port name}.json. Misalnya, file versi zlib akan terletak di versions/z-/zlib.json. Selain file versi port, file garis besar saat ini terletak di versions/baseline.json.