Sürüm oluşturmaya başlama
Bildirimleri olan sürümleri kullanma
fmt
ve zlib
bağlı basit bir CMake projesi oluşturma ile 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 oluşturun.
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
ports/
içinde portfiles kullanmak yerine vcpkg, buildtrees/versioning/versions/
içindeki her sürüm için dosyaları kullanıma alır.
ports/
dosyaları klasik modda vcpkg çalıştırılırken hala kullanılır.
Not
CMake yapılandırılırken vcpkg çıkışı yalnızca CMake sürümü 3.18
veya daha yenisi kullanıldığında kullanılabilir. Daha eski bir CMake kullanıyorsanız, bunun yerine derleme dizininizdeki vcpkg-manifest-install.log
dosyasını de kontrol edebilirsiniz.
MSBuild ile bildirimlerin nasıl kullanılacağını öğ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 version-string
özelliğini kullanarak 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ümleri: 1.2.0 ve 1.2.0-rc . |
version-date |
YYYY-MM-DD biçimde 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 "dependencies"
bildirimlerinin bir parçası olarak izin verilir. Örneğimizde, fmt
sürüm 7.1.3#1
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, zlib
fmt
sürüme bağımlılık bildirecekse 7.1.4
vcpkg bunun yerine 7.1.4
yükler.
vcpkg en düşük sürüm yaklaşımını kullanır. Örneğimizde, fmt
sürüm 8.0.0
yayınlanacak olsa bile vcpkg, kısıtlamayı karşılayan en düşük sürüm olduğundan sürüm 7.1.3#1
yüklemeye 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 temel ayarlamak gerekir, aksi takdirde geçerli sürümleri ports/
dizininde 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 "builtin-baseline"
belgelerine bakın.
Örneğimizde, zlib
için sürüm kısıtlaması bildirmeyiz; bunun yerine, sürüm temelden alınır. Vcpkg dahili olarak, zlib
sürümünün o anda en son sürümü olduğunu bulmak için işleme 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"
}
] }
Not
1.2.11#7
değeri, 7
bağlantı noktası sürümü 1.2.11
sürümünü temsil eder.
Taban çizgisi 1.2.11#9
zlib
için en düşük sürüm kısıtlaması içerdiğinden ve daha yüksek bir sürüm 1.2.11#7
için 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ığına bağımlı olmak istiyorsanız, baseline
bir kez ayarlamak, her pakette sürüm kısıtlaması bildirmekten 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ü (nokta) kullanmaya zorlar.
Örneğimizi bir kez daha değiştirelim, bu kez vcpkg'yi fmt
sürümü 6.0.0
kullanmaya zorlamak için.
{
"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
fmt
artık istediğimiz gibi 6.0.0
sürümünde 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 defteriniziyapmayı düşünmelisiniz.
Daha fazla okuma
Sürüm oluşturmanın nasıl çalıştığına ilişkin ayrıntılı bilgi edinmek istiyorsanız Sürüm Oluşturma başvuru ve Sürüm oluşturma kavramlarımakalemizi okumanızı öneririz.