requirements()

requirements() 方法用于指定包的依赖项。

def requirements(self):
    self.requires("zlib/1.2.11")

对于简单的情况,可以使用属性语法,例如 requires = "zlib/1.2.11"

Requirement 特性

特性是 requires 子句的属性。它们决定了 Conan 如何处理和传播依赖项的各个部分。特性的值通常由 Conan 基于依赖项的 package_type 计算得出,但也可以手动指定。

Conan 2.0 中高级依赖模型演示文稿中对特性进行了很好的介绍。

在下面的示例中,headerslibs 是特性。

self.requires("math/1.0", headers=True, libs=True)

headers

表示此包将在编译时 #include 头文件。依赖项将在 host 上下文中。

libs

依赖项包含一些将在使用者链接时使用的库或工件。对于直接共享和静态库,此特性通常为 True,但对于通过共享库使用的间接静态库,则可能为 false。依赖项将在 host 上下文中。

build

此依赖项是一个构建工具、应用程序或可执行文件,例如 cmake,它专门在构建时使用。它不会链接/嵌入到二进制文件中,并且将在 build 上下文中。

警告

定义 build=True 的构建时需求(tool_requiresbuild_requires)旨在与其默认的 visible=False 一起使用,目前强烈建议将其保留为 visible=False。如果您认为可能有一个用例,最好先在 https://github.com/conan-io/conan/issues 中讨论并询问,而不是尝试启用 visible=True

对于某些非常特殊的情况,有实验性支持,允许定义 build=True 的 build/tool requires,同时也定义 visible=True,但这是实验性的,并且可能会在未来的 Conan 版本中发生重大更改。众所周知,它的设计目的是不传播所有特性,例如,不会传播 headers/libs,因为“build”上下文中的头文件和库无法在 host 上下文中链接。

run

此依赖项包含一些可执行文件,无论是应用程序还是共享库,都需要它们可执行(通常在路径或其他系统环境变量中)。对于 build=False,此特性可以为 True,在这种情况下,该包将包含一些在安装时可以在 host 系统中运行的可执行文件,通常类似于最终用户应用程序。对于 build=True,此特性可以为 True,该包将包含一些在 build 上下文中运行的可执行文件,通常在用于构建其他包时使用。

visible

即使此 require 不传播 headerslibsrun 特性,它也会向下游传播。向下游传播的需求可能会导致版本冲突。这通常为 True,因为在大多数情况下,在同一依赖图中有同一库的 2 个不同版本至少很复杂,如果不是直接违反 ODR 或导致链接错误。在高级场景中,当我们需要在构建期间使用同一包的不同版本时,可以将其设置为 False

transitive_headers

如果为 True,则依赖项的头文件将在下游可见。

transitive_libs

如果为 True,则与依赖项链接的库将在下游可见。

test

此需求是一个测试库或框架,例如 Catch2 或 gtest。它主要是一个需要包含和链接的库,但不会向下游传播。

package_id_mode

如果 recipe 想要指定依赖项版本如何影响当前包的 package_id,则可以直接在此处指定。

虽然也可以在 package_id() 方法中完成,但似乎在 requires 中指定它更简单,同时避免一些歧义。

# We set the package_id_mode so it is part of the package_id
self.tool_requires("tool/1.1.1", package_id_mode="minor_mode")

这等效于

def package_id(self):
  self.info.requires["tool"].minor_mode()

force

requires 将强制其版本在依赖图上游,覆盖其他现有的版本,甚至是传递依赖项的版本,并解决潜在的现有冲突。下游使用者的 force 特性始终具有更高的优先级。

override

force 特性相同,但不添加 direct 依赖项。如果没有传递依赖项要覆盖,则此 require 将被丢弃。此特性仅在定义 requires 时存在,但在完全评估图后,它将不再作为实际的 requires 存在。

注意

最佳实践

不建议将 forceoverride 特性作为通用的版本控制解决方案来解决冲突,而仅作为解决版本冲突的临时解决方法。应尽可能避免使用它,建议更新图中的版本或版本范围,以避免冲突,而无需覆盖和强制。

direct

如果依赖项是直接依赖项,即它已由当前 recipe 显式声明,或者它是传递依赖项。

options

可以定义依赖项的选项值作为特性

self.requires("mydep/0.1", options={"dep_option": "value"})

警告

在 recipe 中定义选项值没有很强的保证,请查看 关于依赖项选项值的常见问题解答。建议在配置文件中定义选项值。

package_type 特性推断

如果 recipe 没有显式设置某些特性,则会根据 package_type 的值自动推断某些特性。

  • applicationheaders=Falselibs=Falserun=True

  • shared-libraryrun=True

  • static-libraryrun=False

  • header-libraryheaders=Truelibs=Falserun=False

  • build-scriptsheaders=Falselibs=Falserun=Truevisible=False

此外,基于依赖项的 package_type,还会在上述基础上推断出一些额外的特性

  • header-librarytransitive_headers=Truetransitive_libs=True

每种 requires 的默认特性

每种 requires 都会在上一节所述的特性基础上默认设置一些额外的特性。它们是

  • requiresbuild=False

  • build_requiresheaders=Falselibs=Falsebuild=Truevisible=False

  • tool_requiresheaders=Falselibs=Falsebuild=Truerun=Truevisible=False

  • test_requiresheaders=Truelibs=Truebuild=Falsevisible=Falsetest=True