Aracılığıyla paylaş


Sürüm oluşturmaya başlama

Bildirimleri olan sürümleri kullanma

fmt ve zlibbağ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:

  1. Proje için derleme dizinini oluşturun.

    PS D:\versions-test> mkdir build
    PS D:\versions-test> cd build
    
  2. 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
    ...
    
  3. Projeyi oluşturun.

    PS D:\versions-test\build> cmake --build .
    [2/2] Linking CXX executable main.exe
    
  4. Ç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, fmtsü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, zlibfmt 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, zlibiç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, 7bağlantı noktası sürümü 1.2.11sürümünü temsil eder.

Taban çizgisi 1.2.11#9zlib 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#7iç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 fmtsü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.