Sürüm oluşturmaya başlama
Bildirimleri olan sürümleri kullanma
ve'e bağlı fmt
zlib
basit bir CMake projesi oluşturarak başlayalım.
Aşağıdaki dosyaları içeren bir klasör oluşturun:
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)
Şimdi de CMake ile projemizi derleyip çalıştırıyoruz:
Proje için derleme dizinini oluşturun.
PS D:\versions-test> mkdir build PS D:\versions-test> cd build
CMake'yi yapılandırın.
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 ...
Projeyi derleyin.
PS D:\versions-test\build> cmake --build . [2/2] Linking CXX executable main.exe
Çalıştır!
PS D:\versions-test\build> ./main.exe fmt version is 70103 zlib version is 1.2.11
Çıkışa göz atın:
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
içinde portfiles ports/
kullanmak yerine vcpkg içindeki her sürümün buildtrees/versioning/versions/
dosyalarını kullanıma alır. içindeki ports/
dosyalar klasik modda vcpkg çalıştırılırken hala kullanılır.
Dekont
CMake yapılandırılırken vcpkg çıktısı yalnızca CMake sürümü veya daha yenisi 3.18
kullanılırken kullanılabilir. Daha eski bir CMake kullanıyorsanız, bunun yerine derleme dizininizdeki dosyayı de kontrol vcpkg-manifest-install.log
edebilirsiniz.
MSBuild ile bildirimleri kullanmayı öğrenmek için bildirim duyurusu blog gönderimizi okuyun.
Bildirim değişiklikleri
Bildirimleri daha önce kullandıysanız bazı yeni JSON özellikleri olduğunu fark edeceksiniz. Şimdi şu değişiklikleri gözden geçirelim:
version
{
"name": "versions-test",
"version": "1.0.0"
}
Bu, projenizin sürüm bildirimidir. Daha önce, yalnızca özelliğini kullanarak version-string
projeleriniz için sürümleri bildirebiliyorsunuz. Sürüm oluşturma artık ortaya çıktı, vcpkg bazı yeni sürüm oluşturma düzenlerinin farkındadır.
Sürüm düzeni | Açıklama |
---|---|
version |
Noktalı sayısallar: 1.0.0.5 . |
version-semver |
Uyumlu anlamsal sürümler: 1.2.0 ve 1.2.0-rc . |
version-date |
Biçimli YYYY-MM-DD tarihler: 2021-01-01 |
version-string |
Rastgele dizeler: vista , candy . |
version>=
{
"dependencies": [
{ "name": "fmt", "version>=": "7.1.3" },
"zlib"
]
}
Bu özellik, en düşük sürüm kısıtlamalarını ifade etmek için kullanılır, yalnızca bildirimlerin "dependencies"
bir parçası olarak izin verilir. Örneğimizde sürümünde 7.1.3#1
fmt
açık bir kısıtlama ayarladık.
Geçişli bağımlılık daha yeni bir sürüm gerektiriyorsa vcpkg'nin bu kısıtlamayı yükseltmesine izin verilir. Örneğin, sürüme fmt
7.1.4
bir bağımlılık bildirecek olursa zlib
vcpkg yüklenir7.1.4
.
vcpkg en düşük sürüm yaklaşımını kullanır. Örneğimizde, sürüm 8.0.0
yayınlanacak olsa fmt
bile, vcpkg kısıtlamayı karşılayan en düşük sürüm olduğundan sürümü yüklemeye 7.1.3#1
devam eder. Bu yaklaşımın avantajları, vcpkg'yi güncelleştirdiğinizde beklenmeyen bağımlılık yükseltmeleri almamanızı ve aynı bildirimi kullandığınız sürece yeniden üretilebilir derlemeler (kullanılan sürüm açısından) almanızdır.
Bağımlılıklarınızı yükseltmek istiyorsanız, en düşük sürüm kısıtlamasını yükseltebilir veya daha yeni bir temel kullanabilirsiniz.
builtin-baseline
{ "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc" }
Bu alan, tüm bağlantı noktaları için sürüm oluşturma temelini bildirir. Sürüm oluşturmayı etkinleştirmek için bir temel ayarlamak gerekir, aksi takdirde dizinde ports/
geçerli sürümleri alırsınız. Geçerli vcpkg işlemesini almak ve yerleşik taban çizgisi olarak ayarlamak için 'git rev-parse HEAD' komutunu çalıştırabilirsiniz. Daha fazla bilgi için belgelere "builtin-baseline"
bakın.
Örneğimizde için zlib
bir sürüm kısıtlaması bildirmeyiz; bunun yerine sürüm temelden alınır. Dahili olarak vcpkg, o anda en son sürümün zlib
hangisi olduğunu bulmak için işlemeye 3426db05b996481ca31e95fff3734cf23e0f51bc
bakar (bizim durumumuzda ).1.2.11#9
Sürüm çözümlemesi sırasında temel sürümler en düşük sürüm kısıtlamaları olarak değerlendirilir. Temel sürümden daha düşük bir açık kısıtlama bildirirseniz, açık kısıtlama temel sürüme yükseltilir.
Örneğin, bağımlılıklarımızı şöyle değiştirdiysek:
{ "dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
] }
Dekont
değeri 1.2.11#7
, sürümü 1.2.11
, bağlantı noktası sürümünü 7
temsil eder.
Taban çizgisi için 1.2.11#9
en düşük sürüm kısıtlamasını zlib
içerdiğinden ve daha yüksek bir sürüm için 1.2.11#7
en düşük sürüm kısıtlamasını karşıladığından, vcpkg'nin yükseltmesine izin verilir.
Temeller, aynı anda birden çok sürümü yükseltmek için de kullanışlı bir mekanizmadır. Örneğin, birden çok boost
kitaplıka bağımlı olmak istiyorsanız, her pakette bir sürüm kısıtlaması bildirmek yerine bir kez ayarlamak baseline
daha uygundur.
Peki temelden daha eski bir sürümü sabitlemek isterseniz ne olur?
overrides
Temeller tüm paketler için bir sürüm katı oluşturduğundan ve açık kısıtlamalar temelden düşük olduğunda yükseltildiğinden, temelden önceki sürümleri düşürmek için başka bir mekanizmaya ihtiyacımız vardır.
vcpkg'nin bu senaryo için sağladığı mekanizma: overrides
. Bir pakette geçersiz kılma bildirildiğinde, vcpkg bildirimde doğrudan bildirilen veya geçişli bağımlılıklardan gelen diğer tüm sürüm kısıtlamalarını yoksayar. Kısacası, overrides
vcpkg'yi belirtilen tam sürümü kullanmaya zorlar, nokta.
Bu kez vcpkg'yi sürümünü 6.0.0
fmt
kullanmaya zorlamak için örneğimizi bir kez daha değiştirelim.
{
"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"
}
]
}
Projemizi yeniden oluşturun:
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
Ve çalıştır!
PS D:\versions-test\build> .\main.exe
fmt version is 60000
zlib version is 1.2.11
sürümünün fmt
artık istediğimiz gibi nasıl 6.0.0
olduğuna dikkat edin.
Sürümler ve özel bağlantı noktaları
Tartışılması gereken son şey katman bağlantı noktalarının sürüm oluşturma çözünürlüğüyle nasıl etkileşimde bulunduğudur. Cevap şudur: onlar değil.
Daha ayrıntılı olarak, bir bağlantı noktası için katman sağladığınızda, vcpkg içinde hangi sürümün bulunduğuna dikkat etmeden her zaman katman bağlantı noktasını kullanır. Bunun nedenleri ikiye katlanır: (1) var olan bağlantı noktasını tamamen maskeleme katman bağlantı noktalarının mevcut davranışıyla tutarlıdır ve (2) katman bağlantı noktaları vcpkg'nin sürüm oluşturma özelliğini desteklemek için yeterli bilgi sağlamaz (ve bunu yapması beklenmez).
Sürüm oluşturma ile birlikte esnek bağlantı noktası özelleştirmesi yapmak istiyorsanız, kendi özel kayıt defterinizi oluşturmayı düşünmelisiniz.
Daha fazla bilgi
Sürüm oluşturmanın nasıl çalıştığına ilişkin ayrıntıları ayrıntılı olarak öğrenmek istiyorsanız Sürüm oluşturma başvurumuzu ve Sürüm oluşturma kavramlarımızı okumanızı öneririz.