Aracılığıyla paylaş


Sürüm oluşturmaya başlama

Bildirimleri olan sürümleri kullanma

ve'e bağlı fmtzlibbasit 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:

  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 derleyin.

    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

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#1fmtaçı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 fmt7.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 zlibbir 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ü 7temsil 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#7en 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.0fmtkullanmaya 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.