背景
VCPKG目前有2種模式使用提供的庫,經典模式和manifest 模式,經典模式最早安裝使用庫的方式,是為了區分manifest模式給出的名稱,manifest 可以理解為清單模式。
經典模式下 ,當您在私有項目中使用vcpkg安裝的庫時,必須首先通過vcpkg install命令安裝了依賴的庫才可以使用,而且所有安裝在vcpkg installed 目錄下的庫對當前所有項目都是可見的。
這會帶一些問題,例如2個項目需要各依賴同一個庫的不同版本,2個項目中各自依賴的2個庫互相沖突,以往的解決方案是給每一個項目單獨配置一份vcpkg,單獨去集成,這樣很不方便,使用manifest模式能很方便的解決這個問題。
Manifest(清單)模式
當使用 vcpkg install 命令安裝庫時,被安裝的庫的依賴是通過 ports/PORT_NAME/CONTROL 或 ports/PORT_NAME/vcpkg.json 中的 "Build-depends" 或 "Depends" 關鍵字確定的。同樣的,我們需要創建一個文件並指定私有項目的依賴以通過vcpkg讀取該依賴並自動安裝它們。這個清單文件的文件名稱被指定為 vcpkg.json,通常放置在最頂級的 CMakeLists.txt 的同級目錄下。
注意:manifest模式與傳統模式不能同時使用,您通過install命令安裝的依賴庫將在manifest模式中被重新構建。
Manifest字段詳解
vcpkg.json 文件:
{ "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", "name": "my-application", "version": "0.15.2", "dependencies": [ "boost-system", "libxml2", "yajl" ] }
Manifest文件是json格式的,並且不能包含注釋,但您可以使用 "$" 開頭的字段並將注釋加入其鍵值中,例如示例文件的第二行 "$schema"。
每個清單文件必須包含 name,version 及 dependencies 字段,以下是這些字段的定義。
必選字段
name
您的私有項目名稱,不一定與project名稱一致,但對應鍵值必須是以小寫字母,數字和連接字符 "-" 拼接而成。並且不能以連接字符開頭或結尾。
例如"Boost.Asio"可命名為"boost-asio"。
version
您的私有項目版本號,該鍵名可為以下幾種之一:
| 鍵名 |
說明 |
| version |
使用點(.)分隔的數字版本號 |
| version-semver |
SemVer的兼容版本號(請查看相關文檔semver) |
| version-date |
格式為YYYY-MM-DD的日期版本號 |
| version-string |
任意字符串版本號 |
dependencies
您的項目依賴表,它是一個字符串和對象組成的數組,可以以下兩種方式聲明:
1. 字符串依賴是最簡單的依賴方式(例如 "dependencies": [ "zlib" ])。由於不聲明該依賴項的版本,平台限制,特性及默認特性,vcpkg會安裝指定的依賴庫(包括默認特性)。
2. 對象依賴(例如 "dependencies": [ { "name": "zlib" } ])。該方式允許您聲明該依賴項的版本,平台限制,特性及默認特性。示例:
vcpkg.json
"dependencies": [ { "name": "arrow", "default-features": false, "features": [ "json" ] }, "boost-asio", "openssl" ]
其中:"name"為依賴項的名稱。"default-features"為是否啟用默認特性。"features"為依賴項的指定特性。
platform
"platform"為當前依賴指定的平台,若編譯環境不在該平台上則不會生成該依賴。
這是一個字符串字段,它采用形式為<identifier>, !expression, expression { & expression & expression...} 與布爾表達式 { | expression | expression...}以及括號來表示優先級。
例如,僅安裝在 Windows 操作系統、ARM64 架構和 x64 上的 Linux 上的依賴項將被寫入(windows & arm64) | (linux & x64)。
常見的標識符有:
操作系統:windows、uwp、linux、osx(包括 macOS)、android、emscripten
架構:x86, x64, wasm32, arm64, arm(由於向后兼容,包括 arm32 和 arm64)
示例: vcpkg.json
{ "name": "zlib", "platform": "!windows" }
可選字段
除了以上三個必選字段外,還有以下幾個可選字段:
description
您可添加該字段來描述您的項目,鍵值為字符串或字符串數組。當您使用字符串數組時,數組中第一個字符串默認為摘要信息,而其余字符串默認為完整信息。
builtin-baseline
此字段表示vcpkg的commit,為您清單文件中未聲明版本的依賴項提供默認版本信息。詳情請參閱版本控制。
overrides
您可使用該字段強制聲明依賴項的具體版本號和補丁版本號,該版本的優先度最高。示例:
vcpkg.json 文件:
"overrides": [ { "name": "arrow", "version": "1.2.3", "port-version": 7 } ]
請勿將此字段加入"dependencies"中,而應當與其他關鍵字並列。更多信息請參閱版本控制。
supports
若您的該私有項目不支持所有平台,可聲明該字段並將支持的平台值傳入鍵值中。可選鍵值請參考"platform"。
features 與 default-features
若您的項目有可選特性,則可使用該字段聲明,以讓其他項目(非默認的或默認的)開啟或關閉這些特性。它的值為一個對象,其中包含以下字段:
1. "description" 為該特性的描述信息,鍵值為字符串。該項為必選項。詳情請參閱description字段。
2. "dependencies" 為特性的依賴項,該項可選。鍵值請參閱dependencies字段。
3. "supports" 為該特性支持的平台,該項可選。鍵值請參閱supports。
若您希望某一個特性應當被默認啟動,請將該特性名稱加入 "default-features" 中。該字段為字符串數組,示例:
vcpkg.json文件:
{ "name": "libdb", "version": "1.0.0", "description": [ "An example database library.", "Optionally can build with CBOR, JSON, or CSV as backends." ], "$default-features-explanation": "Users using this library transitively will get all backends automatically", "default-features": [ "cbor", "csv", "json" ], "features": { "cbor": { "description": "The CBOR backend", "dependencies": [ { "$explanation": [ "This is how you tell vcpkg that the cbor feature depends on the json feature of this package" ], "name": "libdb", "default-features": false, "features": [ "json" ] } ] }, "csv": { "description": "The CSV backend", "dependencies": [ "fast-cpp-csv-parser" ] }, "json": { "description": "The JSON backend", "dependencies": [ "jsoncons" ] } } }
以上就是清單文件中所有的關鍵字。
參考:https://github.com/microsoft/vcpkg/blob/master/docs/users/manifests.md
