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.
Menggunakan versi dengan manifes
Mari kita mulai dengan membuat proyek CMake sederhana yang bergantung pada fmt dan zlib.
Buat folder dengan file berikut:
vcpkg.json
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
main.cpp
#include <fmt/core.h>
#include <zlib.h>
int main()
{
fmt::print("fmt version is {}\n"
"zlib version is {}\n",
FMT_VERSION, ZLIB_VERSION);
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(versionstest CXX)
add_executable(main main.cpp)
find_package(ZLIB REQUIRED)
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)
Dan sekarang kita membangun dan menjalankan proyek kita dengan CMake:
Buat direktori build untuk proyek.
PS D:\versions-test> mkdir build PS D:\versions-test> cd buildKonfigurasikan CMake.
PS D:\versions-test\build> cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake .. -- Running vcpkg install Detecting compiler hash for triplet x86-windows... The following packages will be built and installed: fmt[core]:x64-windows -> 7.1.3#1 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72 vcpkg-cmake[core]:x64-windows -> 2021-02-26 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\vcpkg-cmake\51896aa8073adb5c8450daa423d03eedf0dfc61f vcpkg-cmake-config[core]:x64-windows -> 2021-02-26 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\vcpkg-cmake-config\d255b3d566a8861dcc99a958240463e678528066 zlib[core]:x64-windows -> 1.2.11#9 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4 ...Bangun proyek.
PS D:\versions-test\build> cmake --build . [2/2] Linking CXX executable main.exeJalankan!
PS D:\versions-test\build> ./main.exe fmt version is 70103 zlib version is 1.2.11
Lihat outputnya:
fmt[core]:x86-windows -> 7.1.3#1 -- D:\vcpkg\buildtrees\versioning\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72
...
zlib[core]:x86-windows -> 1.2.11#9 -- D:\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
Alih-alih menggunakan portfiles di ports/, vcpkg memeriksa file untuk setiap versi di buildtrees/versioning/versions/. File dalam ports/ masih digunakan saat menjalankan vcpkg dalam mode klasik.
Nota
Output dari vcpkg saat mengonfigurasi CMake hanya tersedia saat menggunakan versi CMake 3.18 atau yang lebih baru. Jika Anda menggunakan CMake yang lebih lama, Anda dapat memeriksa file vcpkg-manifest-install.log di direktori build Anda sebagai gantinya.
Baca posting blog pengumuman manifes kami untuk mempelajari cara menggunakan manifes dengan MSBuild.
Perubahan manifes
Jika Anda telah menggunakan manifes sebelum Anda akan melihat bahwa ada beberapa properti JSON baru. Mari kita tinjau perubahan ini:
version
{
"name": "versions-test",
"version": "1.0.0"
}
Ini adalah deklarasi versi proyek Anda. Sebelumnya, Anda hanya dapat mendeklarasikan versi untuk proyek Anda menggunakan properti version-string. Sekarang penerapan versi telah muncul, vcpkg menyadari beberapa skema penerapan versi baru.
| Skema versi | Deskripsi |
|---|---|
version |
Numerik yang dipisahkan titik: 1.0.0.5. |
version-semver |
Versi semantik yang sesuai: 1.2.0 dan 1.2.0-rc. |
version-date |
Tanggal dalam format YYYY-MM-DD: 2021-01-01 |
version-string |
String arbitrer: vista, candy. |
version>=
{
"dependencies": [
{ "name": "fmt", "version>=": "7.1.3" },
"zlib"
]
}
Properti ini digunakan untuk mengekspresikan batasan versi minimum, hanya diizinkan sebagai bagian dari deklarasi "dependencies". Dalam contoh kami, kami menetapkan batasan eksplisit pada 7.1.3#1 versi fmt.
vcpkg diizinkan untuk meningkatkan batasan ini jika dependensi transitif memerlukan versi yang lebih baru. Misalnya, jika zlib mendeklarasikan dependensi pada versi fmt7.1.4 maka vcpkg akan menginstal 7.1.4 sebagai gantinya.
vcpkg menggunakan pendekatan versi minimum, dalam contoh kami, bahkan jika versi fmt8.0.0 dirilis, vcpkg masih akan menginstal versi 7.1.3#1 karena itu adalah versi minimum yang memenuhi batasan. Keuntungan dari pendekatan ini adalah Anda tidak mendapatkan peningkatan dependensi yang tidak terduga saat memperbarui vcpkg dan Anda mendapatkan build yang dapat direproduksi (dalam hal versi yang digunakan) selama Anda menggunakan manifes yang sama.
Jika Anda ingin meningkatkan dependensi, Anda dapat menabrak batasan versi minimum atau menggunakan garis besar yang lebih baru.
builtin-baseline
{ "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc" }
Bidang ini mendeklarasikan garis besar penerapan versi untuk semua port. Mengatur garis besar diperlukan untuk mengaktifkan penerapan versi, jika tidak, Anda akan mendapatkan versi saat ini pada direktori ports/. Anda dapat menjalankan 'git rev-parse HEAD' untuk mendapatkan penerapan vcpkg saat ini dan mengaturnya sebagai garis besar bawaan. Lihat dokumentasi"builtin-baseline" untuk informasi selengkapnya.
Dalam contoh kami, kami tidak menyatakan batasan versi untuk zlib; sebagai gantinya, versi diambil dari garis besar. Secara internal, vcpkg akan melihat penerapan 3426db05b996481ca31e95fff3734cf23e0f51bc untuk mengetahui versi zlib apa yang terbaru pada saat itu (dalam kasus kami 1.2.11#9).
Selama resolusi versi, versi dasar diperlakukan sebagai batasan versi minimum. Jika Anda menyatakan batasan eksplisit yang lebih rendah dari versi dasar, batasan eksplisit akan ditingkatkan ke versi dasar.
Misalnya, jika kita memodifikasi dependensi kita seperti ini:
{ "dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
] }
Nota
Nilai 1.2.11#7 mewakili versi 1.2.11, versi port 7.
Karena garis besar memperkenalkan batasan versi minimum untuk zlib pada 1.2.11#9 dan versi yang lebih tinggi memenuhi batasan versi minimum untuk 1.2.11#7, vcpkg diizinkan untuk meningkatkannya.
Garis besar juga merupakan mekanisme yang nyaman untuk meningkatkan beberapa versi sekaligus, misalnya, jika Anda ingin bergantung pada beberapa pustaka boost, lebih mudah untuk mengatur baseline sekali daripada mendeklarasikan batasan versi pada setiap paket.
Tetapi bagaimana jika Anda ingin menyematkan versi yang lebih lama dari garis besar?
overrides
Karena garis besar menetapkan lantai versi untuk semua paket dan batasan eksplisit ditingkatkan ketika lebih rendah dari garis besar, kita memerlukan mekanisme lain untuk menurunkan versi melewati garis besar.
Mekanisme vcpkg menyediakan skenario tersebut overrides. Ketika penimpaan dideklarasikan pada paket, vcpkg akan mengabaikan semua batasan versi lainnya baik secara langsung dideklarasikan dalam manifes atau dari dependensi transitif. Singkatnya, overrides akan memaksa vcpkg untuk menggunakan versi yang tepat yang dideklarasikan, titik.
Mari kita ubah contoh kita sekali lagi, kali ini untuk memaksa vcpkg menggunakan versi 6.0.0fmt.
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "fmt",
"version": "6.0.0"
}
]
}
Membangun kembali proyek kami:
PS D:\versions-test\build> rm ./CMakeCache.txt
PS D:\versions-test\build> rm -r ./vcpkg_installed
PS D:\versions-test\build> cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake ..
-- Running vcpkg install
Detecting compiler hash for triplet x86-windows...
The following packages will be built and installed:
fmt[core]:x86-windows -> 6.0.0 -- D:\vcpkg\buildtrees\versioning\versions\fmt\d99b6a35e1406ba6b6e09d719bebd086f83ed5f3
zlib[core]:x86-windows -> 1.2.11#9 -- D:\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
...
PS D:\versions-test\build> cmake --build .
[2/2] Linking CXX executable main.exe
Dan jalankan!
PS D:\versions-test\build> .\main.exe
fmt version is 60000
zlib version is 1.2.11
Perhatikan bagaimana fmt sekarang dalam versi 6.0.0 seperti yang kami inginkan.
Versi dan port kustom
Hal terakhir yang perlu dibahas adalah bagaimana port overlay berinteraksi dengan resolusi penerapan versi. Jawabannya adalah: mereka tidak.
Masuk ke detail lebih lanjut, ketika Anda menyediakan overlay untuk port, vcpkg akan selalu menggunakan port overlay tanpa peduli versi apa yang terkandung di dalamnya. Alasannya adalah dua kali lipat: (1) konsisten dengan perilaku port overlay yang ada dari menutupi port yang ada sepenuhnya, dan (2) port overlay tidak (dan tidak diharapkan) memberikan informasi yang cukup untuk mendukung fitur penerapan versi vcpkg.
Jika Anda ingin memiliki kustomisasi port yang fleksibel bersama dengan penerapan versi, Anda harus mempertimbangkan membuat registri kustom Anda sendiri.
Bacaan lebih lanjut
Jika Anda tertarik untuk mempelajari lebih dalam detail cara kerja penerapan versi, kami sarankan Anda membaca referensi penerapan Versi kami dan konsep Penerapan Versi .