Tutorial: Menginstal versi paket tertentu
vcpkg memungkinkan Anda mengontrol versi yang tepat dari setiap dependensi dalam proyek Anda.
Dalam tutorial ini, Anda akan belajar untuk:
Prasyarat
- Terminal
- Editor kode
- vcpkg
- CMake
1 - Membuat proyek dengan manifes
Di folder kosong, buat file proyek berikut:
File sumber (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;
}
File proyek CMake (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)
Manifest vcpkg (vcpkg.json
):
{
"dependencies": [ "fmt", "zlib" ]
}
Bangun proyek, ganti %VCPKG_ROOT%
dengan jalur penginstalan vcpkg Anda:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
Jalankan program:
fmt version is 70103
zlib version is 1.2.11
Kemungkinan, ketika Anda menjalankan program, versi pustaka ini berbeda dari output di atas. Pada langkah berikutnya, kami menunjukkan kepada Anda cara mengunci versi dependensi ini sehingga tetap konsisten setiap kali Anda membangun proyek.
2 - Menambahkan batasan versi menggunakan garis besar
Dasar versi menetapkan batas versi minimum untuk semua paket. Baca konsep vcpkg untuk mempelajari garis besar.
Untuk mendapatkan versi yang tepat yang digunakan pada langkah sebelumnya, ubah konten vcpkg.json
menjadi:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Mengatur builtin-baseline
ke SHA penerapan tertentu dari repositori vcpkg menginstruksikan vcpkg untuk menggunakan versi paket pada penerapan spesifik tersebut sebagai versi minimum untuk semua paket.
Anda dapat menggunakan Git untuk memeriksa versi untuk garis besar tertentu:
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
Output akan terlihat mirip dengan ini:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 - Memperbarui versi dasar
Baseline menawarkan mekanisme yang nyaman untuk memperbarui versi-versi semua ketergantungan Anda sekaligus. Untuk memperbarui garis besar Anda, jalankan perintah berikut:
vcpkg x-update-baseline
Perintah x-update-baseline
memodifikasi file manifes Anda untuk menetapkan builtin-baseline
ke commit Git saat ini dari instans vcpkg Anda.
Anda dapat menggunakan opsi --add-initial-baseline
untuk menambahkan builtin-baseline
ke manifes yang belum memilikinya.
4 - Menambahkan batasan versi minimum
Dasar acuan bukan satu-satunya cara untuk mengunci versi paket. vcpkg juga menerima batasan versi minimum dalam bentuk version>=
.
Ubah konten vcpkg.json
menjadi:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
File manifes di atas menggunakan notasi objek dependensi untuk mengatur batasan versi minimum (version>=
) pada fmt
. Untuk memenuhi dependensi vcpkg perlu memenuhi dua batasan, satu berasal dari garis besar dan satu berasal dari batasan versi minimum dalam daftar dependencies
.
- Batasan garis besar,
"version>=": "7.1.3"
. - Batasan daftar dependensi,
"version>=": "10.1.1"
.
Bangun dan jalankan proyek, ganti %VCPKG_ROOT%
dengan jalur penginstalan vcpkg Anda:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
Output akan terlihat seperti ini:
fmt version is 100100
zlib version is 1.2.11
Dalam hal ini, versi 10.1.1
fmt
memenuhi kedua batasan. Perhatikan bagaimana zlib
mendapatkan versi dasarnya 1.2.11
.
5 - Paksa versi tertentu
Dalam beberapa kasus, Anda mungkin ingin memaksa versi paket tertentu, misalnya:
- Untuk mengatasi konflik versi.
- Untuk mengunci versi yang lebih lama dari patokan.
- Untuk mengunci versi yang tidak dapat dibandingkan, misalnya:
vista
,xp
.
vcpkg memungkinkan Anda menyelesaikan masalah ini dengan menggunakan penggantian versi.
Ubah konten vcpkg.json
menjadi:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Paket apa pun yang disertakan dalam daftar "overrides"
akan menggunakan versi yang ditentukan saat mengabaikan semua batasan versi lainnya. Dalam contoh ini, baseline 3426db05b996481ca31e95fff3734cf23e0f51bc
menambahkan batasan versi minimum untuk zlib
dengan 1.2.11
, tetapi deklarasi penimpaan memaksa penggunaan versi 1.2.8
sebagai gantinya.
Bangun dan jalankan proyek, ganti %VCPKG_ROOT%
dengan jalur penginstalan vcpkg Anda:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
Output akan terlihat seperti ini:
fmt version is 100100
zlib version is 1.2.8
Langkah berikutnya
Dalam tutorial ini, Anda mempelajari berbagai mekanisme yang ditawarkan vcpkg untuk mengunci versi paket tertentu. Baca konsep penerapan versi dan referensi untuk mempelajari selengkapnya tentang cara vcpkg menangani resolusi versi.
Berikut adalah beberapa tugas tambahan untuk dicoba berikutnya:
- Menggunakan kembali biner di seluruh eksekusi Integrasi Berkelanjutan menggunakan penembolokan biner
- Mengelola pustaka privat Anda menggunakan registri kustom