概念:默认功能

本文介绍默认功能的概念、其含义和有效管理策略。

默认功能是在安装端口时自动包含的一组功能(除非显式禁用)。 这些功能可确保库保持功能基线级别,即使其依赖项关系图的复杂性增加也是如此。

注意

并非所有端口都包含默认功能。

默认功能的角色

默认功能可确保具有模块化功能的库中提供基本功能,从而提供用户友好的体验。

例如,能够提取各种存档格式的库可能具有每种格式作为可选功能。 如果没有默认功能,该库可能不会直接包含任何提取算法,从而使初始使用复杂化。

除非另有明确请求,否则 vcpkg 安装的包将始终包含其默认功能。 此行为适用于用户通过清单文件或 vcpkg 安装调用所需的包,以及作为依赖项所需的包。

在清单模式下禁用默认功能

"default-features": false 属性添加到依赖项声明,以禁用其默认功能的安装。

只有用户请求的依赖项才能禁用默认功能的自动安装。

如果要禁用可传递依赖项的默认功能,需要将其提升为项目清单中的直接依赖项。

在经典模式下禁用默认功能

将特殊 core 功能添加为要安装的包请求的功能的一部分。

注意

如果想要禁用可传递依赖项的默认功能,类似于清单模式的工作原理;需要在命令行中将其提升为直接安装请求。

示例 1:包括具有默认功能的库

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

在此方案中,extract-any 安装了其默认功能,从而确保即时功能。

示例 2:禁用默认功能(清单模式)

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

此处已安装 extract-any,但未安装其默认功能,从而允许进行定制设置。

示例 3:禁用默认功能(经典模式)

vcpkg install extract-any[core]

此处使用特殊 core 功能安装了 extract-any,但未安装其默认功能。

默认功能交互

  1. 安装具有默认功能的端口(默认行为):由于缺少特定功能请求,vcpkg install extract-any 安装了 extract-any 及其默认功能 (extract-any[format-a])。

  2. 指定功能而不禁用默认值vcpkg install extract-any[format-b] 导致安装 extract-any 以及指定的功能 (format-b) 和默认 (format-a) 功能 (extract-any[format-a,format-b])。

  3. 显式禁用默认功能vcpkg install extract-any[core] 安装了 extract-any,但未安装任何默认功能,因为 [core] 会显式将其排除。

  4. 可传递依赖项和默认功能:如果 portB 依赖于 extract-any[format-a]vcpkg install extract-any[format-b] portB 可能会导致安装 extract-any[format-a,format-b] portB,但不会显式禁用 extract-any 的默认功能。

  5. 将端口与各种功能规范相结合vcpkg install extract-any[format-b] portB 安装 extract-any[format-a, format-b] portB,包括 extract-any 的默认功能(除非显式排除)。

  6. 全面禁用默认功能vcpkg install extract-any[core] portB 确保 extract-any 仅随显式请求的功能一起安装,不包括默认值。

管理默认功能

若要有效地管理项目中的默认功能,请执行以下操作:

  • 显式:仅指定所需的功能。 使用 [core] 在必要时禁用默认功能。
  • 检查依赖项:使用 vcpkg depend-info <port> 了解依赖项解析并相应地调整配置。
  • 利用覆盖和基线:利用版本控制和基线功能更好地控制依赖项解析。

有关详细信息,请参阅以下部分:

采用明确的默认功能管理策略将有助于简化项目的依赖项管理,确保仅包含应用程序功能所需的内容。