vcpkg版本管理

背景

在實(shí)際項(xiàng)目中辈双,您的項(xiàng)目代碼需要依賴第三方庫的歷史版本,以往的做法是將vcpkg回退到需要使用的版本,或者是自定義版本没龙,這會導(dǎo)致其他的庫也回退到以前的版本溪王。 現(xiàn)在vcpkg提供了versioning 特性,可以方便地解決這個(gè)問題兄朋。Versioning 特性是默認(rèn)開啟的响鹃,不需要額外的設(shè)置來啟用。注意:此特性依賴于manifest模式褐捻,使用這個(gè)特性前請先了解manifest特性。

使用示例

1. 創(chuàng)建一個(gè)簡單的cmake工程硫椰, 然后讓它依賴于 fmt 和 zlib帮坚, 假設(shè)需要依賴fmt版本大于等于 7.1.3。 創(chuàng)建文件夾 versioning 并包含以下3個(gè)文件 vcpkg.json匾荆,main.cpp, CMakeLists.txt:

vcpkg.json:

{
    "name": "versions-test",
    "version": "1.0.0",
    "dependencies": [
     {
        "name": "fmt",
        "version>=": "7.1.3"
      },
      "zlib"
    ],
    "builtin-baseline": "99dc49dae7e170c3be63dd097230007f3bb73c4f"
}

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)

現(xiàn)在可以構(gòu)建和運(yùn)行cmake工程:

1. 創(chuàng)建cmake工程構(gòu)建目錄:

E:\vcpkg\vcpkgtest\versioning>mkdir build
E:\vcpkg\vcpkgtest\versioning>cd build

2. 配置CMake工程:

cmake -G "Visual Studio 16 2019" -DVCPKG_TARGET_TRIPLET=x64-windows "-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/vcpkg_debug/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
E:\vcpkg\vcpkgtest\versioning\build>cmake  -G "Visual Studio 16 2019" "-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/vcpkg_debug/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
-- Running vcpkg install
Detecting compiler hash for triplet x64-windows...
A suitable version of powershell-core was not found (required v7.1.3). Downloading portable powershell-core v7.1.3...
Extracting powershell-core...
The following packages will be built and installed:
    fmt[core]:x64-windows -> 7.1.3 -- E:\vcpkg\vcpkg_debug\vcpkg\buildtrees\versioning\versions\fmt\dd8cf5e1a2dce2680189a0744102d4b0f1cfb8b6
    zlib[core]:x64-windows -> 1.2.11#9 -- E:\vcpkg\vcpkg_debug\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
Using cached binary package: C:\Users\phoebe\AppData\Local\vcpkg\archives\c1\c1284fcdc26b903209c61a3a1cdaf0c511f63183f33d6586b7012a778638af17.zip
Could not locate cached archive: C:\Users\phoebe\AppData\Local\vcpkg\archives\66\6651ef3a357c7ae220bedb6037b75b52421c637c7ecce7da40b8ac8a5067686c.zip
Starting package 1/2: fmt:x64-windows
…
Stored binary cache: C:\Users\phoebe\AppData\Local\vcpkg\archives\66\6651ef3a357c7ae220bedb6037b75b52421c637c7ecce7da40b8ac8a5067686c.zip
Building package zlib[core]:x64-windows... done
Installing package zlib[core]:x64-windows...
Installing package zlib[core]:x64-windows... done
Elapsed time for package zlib:x64-windows: 12.73 s

Total elapsed time: 13.39 s

-- Running vcpkg install - done
-- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19043.
-- The CXX compiler identification is MSVC 19.28.29915.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found ZLIB: optimized;E:/vcpkg/vcpkgtest/versioning/build/vcpkg_installed/x64-windows/lib/zlib.lib;debug;E:/vcpkg/vcpkgtest/versioning/build/vcpkg_installed/x64-windows/debug/lib/zlibd.lib (found version "1.2.11")
-- Configuring done
-- Generating done
-- Build files have been written to: E:/vcpkg/vcpkgtest/versioning/build

3. 構(gòu)建cmake工程:

E:\vcpkg\vcpkgtest\versioning\build>cmake --build .
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Checking Build System
Building Custom Rule E:/vcpkg/vcpkgtest/versioning/CMakeLists.txt
main.cpp
main.vcxproj -> E:\vcpkg\vcpkgtest\versioning\build\Debug\main.exe
Building Custom Rule E:/vcpkg/vcpkgtest/versioning/CMakeLists.txt

4. 運(yùn)行cmake工程:

E:\vcpkg\vcpkgtest\versioning\build>.\Debug\main.exe
fmt version is 70103
zlib version is 1.2.11

請重點(diǎn)關(guān)注以下輸出:

fmt[core]:x64-windows -> 7.1.3 -- E:\vcpkg\vcpkg_debug\vcpkg\buildtrees\versioning\versions\fmt\dd8cf5e1a2dce2680189a0744102d4b0f1cfb8b6
zlib[core]:x64-windows -> 1.2.11#9 -- E:\vcpkg\vcpkg_debug\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4

可以看到 fmt選用了7.1.3版本, 而不是使用了本地 .\ports\fmt 提供的版本邦马。注意:cmake3.18 及以后的版本才支持輸出日志到命令框攘烛。如果使用cmake 3.18之前的版本沟突,則需要從當(dāng)前目錄vcpkg-manifest-install.log 文件查看輸出信息。

Versioning 字段

下面介紹versioning特性中涉及到的3個(gè)關(guān)鍵字段:

overrides

如果想指定fmt的版本捕传,例如6.0.0惠拭, 而不是自動從baseline中查找,可以通過添加overrides去實(shí)現(xiàn)庸论。它會覆蓋任何其他的配置职辅,而使用指定的 6.0.0 版本,這個(gè)方式對于解決版本之間的沖突問題特別實(shí)用聂示。示例:

vcpkg.json 文件:

{
    "name": "versions-test",
    "version": "1.0.0",
    "dependencies": [
    {
      "name": "fmt",
      "version>=": "7.1.3"
     },
     "zlib"
    ],
    "builtin-baseline": "99dc49dae7e170c3be63dd097230007f3bb73c4f"域携,
    "overrides": [
    {
       "name": "fmt",
       "version": "6.0.0"
     }
    ]
}

builtin-baseline

關(guān)注以上示例中的zlib,可以發(fā)現(xiàn) vcpkg.json 文件中并沒有聲明任何版本鱼喉,它使用的版本為1.2.11#9秀鞭,這個(gè)版本其實(shí)就是來源于 builtin-baseline。以下是獲取 builtin-baseline 的方法:

1. builtin-baseline 實(shí)際上是vcpkg倉庫包含的 commit id扛禽,實(shí)際操作中我們可以通過執(zhí)行以下git命令來獲取vcpkg庫最新的 commit id:

git rev-parse HEAD

實(shí)際上锋边,vcpkg是通過以下命令來獲取該commit中包含的baseline.json 文件版本。

git show 99dc49dae7e170c3be63dd097230007f3bb73c4f:versions/baseline.json

2. 若需要查找某個(gè)庫對應(yīng)的歷史版本编曼,可以使用以下命令:

 vcpkg x-history PORT_NAME

注意:只能選擇 date > 1/22/2021 以后的 version 所對應(yīng)的 vcpkg commit, 將其設(shè)置為 builtin-baseline豆巨。這是因?yàn)樵谶@之后,vcpkg才支持versioning特性掐场,才有 baseline.json 文件往扔。例如:

E:\vcpkg\clean\vcpkg> ./vcpkg x-history fmt
             version          date    vcpkg commit
             7.1.3#5    2021-07-01    9a7d5a29dd0e066ff4a7dbeba4bd8af4daae8b60
             7.1.3#4    2021-04-28    345921bce4ee724d4c5b164eb93d051667d2d990
             7.1.3#3    2021-04-07    5f77fef68d9f2f5ddc921432914dcbf92b31e989
             7.1.3#2    2021-03-18    c8f6537b80831b1bd951b764bb4fa1f1c7973d83
             7.1.3#1    2021-02-28    3426db05b996481ca31e95fff3734cf23e0f51bc
             7.1.3#0    2020-11-30    1380e8fd4aabfb502023fb8c640fb7b5d73834e9
             7.1.2#0    2020-11-06    d218ca7e6f6eab8679d2e968b43a208e689ac920
             7.1.1#0    2020-11-03    c4c020828aa1b743707876ffaeb0dccf091e96f5
             7.1.0#0    2020-10-26    c31cfd3c81a792d7073e71e8e4f9ab604f0f305e
             7.0.3#3    2020-10-08    54dbd5ca9e808d3437a364c434bff7c6621f42ae
             7.0.3#2    2020-09-04    d951a0033260a63e8d82c64ee1514b1c53364b55
             7.0.3#0    2020-08-07    fbb5131bbc6a66d3950fdd44fbeca85d67fb0ff0
             7.0.2#0    2020-08-06    4f9117c0dea8e58be6dc4102e40238f57b7b8533
             6.2.1#0    2020-06-11    8d399bd86b94fdb4abf8d5c56f2a94b2d3aefda5
           6.2.0-1#0    2020-06-02    c5c350086508005af936a185949e910bfda2821d
             6.2.0#0    2020-04-09    279867cb0c22b1251c5dd50f2dc17030ed9861c9
             6.1.2#0    2020-03-02    705764c63549953c049b34c7a2d67b377d0bd006
           6.0.0-1#0    2020-01-06    153cab79c76175118f5b5d28135a57e00ae75a8d
             6.0.0#0    2019-08-27    8b7f940d82f829bb7d6dbf986225d69b07cbcb40
           5.3.0-2#0    2019-06-15    18b029a5e3997fa4fdc7d3d06d56568a1d6f74ad
           5.3.0-1#0    2019-03-16    d7bf0e581942fca27ef9bf79c6684c8d19ae1967
             5.3.0#0    2019-01-14    e86780d75ffb4476f58c725d40e2456eb503b766
             5.2.1#0    2018-10-25    9c62c6a37ac940abbb4f19237d9a891881421a1a
             5.2.0#0    2018-09-19    64a7483a4a4c9d176896ec7aec08a6acef4ea8f3
             5.1.0#0    2018-07-10    0606add12f907733deba699611eb8692c6c4be9e
           5.0.0-1#0    2018-06-28    3a5b12004e4d9854f4a44337d5fa986b910c6bd6
             5.0.0#0    2018-05-29    b82bbc4945a550c070af351fd769885047b54557
             4.1.0#0    2017-12-26    178517052f42d428bb2f304946e635d3c1f318e9
           4.0.0-1#0    2017-09-09    26516fe485b0e9048dd4809256a7e4526957c6e9
             4.0.0#0    2017-06-27    0ee8ad5cb2ed21731885fa40bd0e2776eec39c71
             3.0.2#0    2017-06-15    2752e690b9230e8078d0688f0b9830874d0662df
           3.0.1-4#0    2017-02-09    43665857a3ad11de8135c7fd6cd9839269212d7d
           3.0.1-3#0    2017-02-03    95af9aac7c39765d1524b7c9c39dc283e9f0facf
           3.0.1-2#0    2017-02-02    62e7557545c17462670b7741d74dd2db4f5612eb
           3.0.1-1#0    2017-01-10    4f5f52ff470e83fa041ac4c6797bfa4e61ed2501
             3.0.1#0    2016-11-22    1f22f927e2f2ba1eb8c702ced4bc6ad811da2bdc
           3.0.0-1#0    2016-11-10    b56819ec88f85d401160197b578b508916ac9962
             3.0.0#0    2016-09-28    36799555441089420f29fcb2724d9fde23bc9ec1

builtin-baseline 具體作用過程:

1. 從給定的 builtin-baseline(commit id)版本中查找是否含有 baseline.json 文件贩猎,如果有,就從這個(gè)文件中查找該庫的版本瓤球。

2. 如果沒有baseline.json融欧,就會報(bào)錯(cuò)。

3. 如果有baseline.json卦羡,但是它不包含庫的歷史版本噪馏,也會報(bào)錯(cuò)。

version>=

以上示例中绿饵,zlib 的版本號 1.2.11#9 是由 version 和 port-version 兩部分組成欠肾,version(1.2.11) 是zlib的實(shí)際的版本號,port-version(9) 是這個(gè)版本在vcpkg中的補(bǔ)丁版本拟赊。兩者組合可以獲取該庫在vcpkg中的具體版本刺桃。

當(dāng)version 版本更新時(shí),port-version 重置為0 吸祟,每次改動都加1瑟慈。如上圖所示,記錄中從上到下顯示了fmt版本的補(bǔ)丁修正與版本更新屋匕。

在vcpkg中葛碧,版本是如何比較大小呢?實(shí)際是比較版本的新舊过吻,例如:

1.2.0 < 1.2.0#1 < 1.2.0#2 < 1.2.0#10
2021-01-01#20 < 2021-01-01.1
windows#7 < windows#8

注意:

1. Version>= 主要用于表示需要使用的最低版本进泼,只有作為 "dependencies"的一部分時(shí)才是被允許的。

2. 如果使用Version>=纤虽, vcpkg會從所有滿足條件的版本中選用最低版本乳绕,這種做法的好處是更新vcpkg時(shí),避免依賴升級出現(xiàn)異常的問題逼纸⊙蟠耄可以總結(jié)為:

如果使用 overrides,那么會使用 overrides 提供的版本杰刽,例如 fmt 6.0.0呻纹。如果沒有,會選擇 version>= 和 builtin-baseline 中最高的版本专缠,例如:

version>= 7.1.3 + builtin-baseline(7.1.4) , 會安裝 fmt 7.1.4淑仆;

version>= 7.1.3 + builtin-baseline(7.1.2) 涝婉, 會安裝 fmt 7.1.3。

3. Vcpkg允許升級版本蔗怠,例如: 如果zlib依賴fmt墩弯,而且聲明依賴fmt 的 7.1.4 版本吩跋,那么vcpkg就會安裝 7.1.4 版本,而不是 7.1.3渔工。

4. 在您的項(xiàng)目中锌钮,如果想升級依賴庫的版本,只需把最低版本改掉引矩,或者是把 builtin-baseline 改為更新的版本梁丘。

5. Vcpkg 不會比較version類型不同的版本,例如:同一個(gè)庫的2 個(gè)版本 ‘version-string: 7.1.3’ 與 version: 7.1.4旺韭,version 類型不同氛谜,所以不能比較。

Versions 文件

在vcpkg 的倉庫中区端,文件夾<u style="border-bottom: 1px solid rgb(68, 68, 68); text-decoration: none;">https://github.com/microsoft/vcpkg/tree/master/versions</u> 目錄下值漫,有baseline.json文件及對應(yīng) portname.json 文件。

例如 zlib:baseline.json 文件包含zlib 當(dāng)前最新的版本织盼,versions/z-/zlib.json 中包含vcpkg 中 zlib的所有可選版本:

{
  "versions": [
    {
      "git-tree": "53a4615c8bb9b98a3864b834a6bbe51cc6c849ef",
      "version-string": "1.2.11",
      "port-version": 10
    },

    {
      "git-tree": "827111046e37c98153d9d82bb6fa4183b6d728e4",
      "version-string": "1.2.11",
      "port-version": 9
    }
}

示例中g(shù)it-tree是 SHA 哈希值杨何,是由 以下 git 命令獲取的:

git rev-parse <commit>:<path>
E:\vcpkg\vcpkg_debug\vcpkg> git rev-parse HEAD:ports/zlib
53a4615c8bb9b98a3864b834a6bbe51cc6c849ef

每次更新時(shí),只需要執(zhí)行 'vcpkg x-add-version zlib' 或者 'vcpkg x-add-version --overwrite-version zlib' 會自動更新zlib.json文件沥邻,不需要手動獲取git-tree SHA 哈希值危虱。可以使用 'vcpkg x-add-version --all' 去更新所有port的版本谋国。
參考:
<u style="border-bottom: 1px solid rgb(68, 68, 68); text-decoration: none;">https://github.com/microsoft/vcpkg/blob/master/docs/examples/versioning.getting-started.md</u>
<u style="border-bottom: 1px solid rgb(68, 68, 68); text-decoration: none;">https://github.com/microsoft/vcpkg/blob/master/docs/users/versioning.md</u>

VCPKG 團(tuán)隊(duì)期待您的貢獻(xiàn)槽地!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芦瘾,隨后出現(xiàn)的幾起案子捌蚊,更是在濱河造成了極大的恐慌,老刑警劉巖近弟,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缅糟,死亡現(xiàn)場離奇詭異,居然都是意外死亡祷愉,警方通過查閱死者的電腦和手機(jī)窗宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來二鳄,“玉大人赴涵,你說我怎么就攤上這事《┧希” “怎么了髓窜?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我寄纵,道長鳖敷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任程拭,我火速辦了婚禮定踱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恃鞋。我一直安慰自己崖媚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布山宾。 她就那樣靜靜地躺著至扰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪资锰。 梳的紋絲不亂的頭發(fā)上敢课,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音绷杜,去河邊找鬼直秆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鞭盟,可吹牛的內(nèi)容都是我干的圾结。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼齿诉,長吁一口氣:“原來是場噩夢啊……” “哼筝野!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粤剧,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤歇竟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抵恋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焕议,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年弧关,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盅安。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡世囊,死狀恐怖别瞭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情株憾,我是刑警寧澤蝙寨,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響籽慢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猫胁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一箱亿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弃秆,春花似錦届惋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衡查,卻和暖如春瘩欺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拌牲。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工俱饿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塌忽。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓拍埠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親土居。 傳聞我的和親對象是個(gè)殘疾皇子枣购,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容