共用方式為


概念:功能

功能

功能代表可在安裝時選擇性地新增至套件或專案的一組功能、行為和相依性。

根據設計,功能應遵循下列原則:

  • 加法:啟用功能應該提供套件中遺漏的新功能,而不需要停用任何其他功能。
  • 非獨佔:啟用功能不應防止安裝其他功能。

不應該使用功能來定義替代的功能集。 例如,圖形庫不應該使用功能在獨佔圖形後端之間進行選擇,因為無法同時安裝所有圖形。

功能可能會對套件的相依性產生下列影響:

  • 新增相依性,包括相同套件中其他功能的相依性。
  • 在現有的相依性上啟用新功能。

欄位會"features"定義一組可用的功能。

範例 1:多個檔案格式

例如,影像操作連結庫可能會根據其他連結庫的不同集合來支持數種不同的影像類型。

{
  "name": "my-image-lib",
  "version": "0.1",
  "features": {
    "png": { "description": "Support PNG files", "dependencies": ["libpng"]},
    "jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
    "tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
  }
}

預設功能

如果最上層項目沒有明確要求建置,則預設功能是一組要自動啟用的功能。 不論專案相依性圖形的複雜程度和可自定義程度為何,預設功能都是為了確保功能的最低層級。

注意

默認功能不是用來建立「策展」或「建議」的模型。

例如,請考慮支持超過10種不同封存格式的連結庫,包括數個相當模糊的連結庫 "extract-any" 。 因為它們都是選擇性的,如果沒有選取連結庫,則無法運作:它無法擷取任何檔案。

默認功能可確保只要將 相依性新增 "extract-any" 至其 vcpkg.json 清單中的使用者,就會取得功能基準層級;例如,自動選取 .zip.tar.gz 解壓縮程式。

範例 2:預設功能作用中

當使用者在未指定功能的情況下新增"extract-any"至其 vcpkg.json 時,會自動包含預設功能(例如 和 .tar.gz 格式的支援.zip),以確保基本功能。

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    "extract-any"
  ]
}

如果使用者想要明確停用預設功能,可以藉由新增 "default-features": false 至相依性來執行此動作:

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    {
      "name": "extract-any",
      "default-features": false
    }
  ]
}

或者,如果在傳統模式中使用 vcpkg,您可以透過core功能停用預設功能。 例如, vcpkg install extract-any[core] 在沒有任何預設功能的安裝 extract-any 時,會 [core] 明確排除它們。

如需詳細資訊,請參閱 預設功能一文

相依性解析

使用 vcpkg 時,相依性解析會扮演重要角色,尤其是在處理具有相依性的功能時。 為了說明,請考慮下列涉及影像操作連結庫的案例:

{
  "name": "my-image-lib",
  "version": "0.1",
  "features": {
    "png": { "description": "Support PNG files", "dependencies": ["libpng"]},
    "jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
    "tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
  }
}

在不同連結庫相依於通用連結庫的各種功能的情況下,vcpkg 可確保考慮所有必要的功能和相依性。 例如,如果需要library-apng功能,而且library-b需要 jpeg 來自的功能my-image-lib,相依性圖表看起來會像這樣:

{
  "name": "library-a",
  "version": "1",
  "dependencies": [{"name": "my-image-lib", "features": ["png"]}]
}
{
  "name": "library-b",
  "version": "1",
  "dependencies": [{"name": "my-image-lib", "features": ["jpeg"]}]
}
{
  "name": "project-using-a-and-b",
  "version": "1",
  "dependencies": [
    "library-a",
    "library-b"
  ]
}

解決這些相依性時,vcpkg 會結合所有必要的功能和相依性,以形成完整的安裝計劃。 在此範例中,視和 而定library-a的專案會產生包含 PNGJPEG 支援的my-image-lib安裝計劃,但不包含 TIFFlibrary-b

libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]

此機制可確保的建置my-image-lib已針對必要功能優化,同時提供和 JPEG 的支持PNG,同時排除不必要的TIFF支援。

進階使用方式

當單一存放庫包含數個不同的可建置元件時,例如具有一些共用程式代碼的用戶端和伺服器應用程式,每個部分的開發人員可能會想要避免安裝其他部分所需的昂貴相依性。

{
  "name": "my-game",
  "dependencies": ["grpc"],
  "features": {
    "client": { "description": "Client Game Executable", "dependencies": ["sdl2", "bullet3"]},
    "server": { "description": "Multiplayer Server Executable", "dependencies": ["proxygen"]},
    "tests": { "description": "Build tests", "dependencies": ["gtest"] }
  }
}

接著,個別開發人員可以選取要安裝的功能:

如需詳細資訊,請參閱下列: