conan.tools.system.package_manager

conan.tools.system.package_manager 下的工具是针对不同平台最流行的系统包管理器的一些包装器。您可以在配方中调用它们来执行最常见的操作,例如安装包、更新包管理器数据库或检查包是否已安装。默认情况下,当您调用它们时,它们不会尝试在系统上安装任何内容,要更改此行为,您可以设置 tools.system.package_manager:mode 配置 的值。

您可以在配方的 system_requirements() 方法中使用这些工具,例如:

conanfile.py
from conan.tools.system.package_manager import Apt, Yum, PacMan, Zypper

def system_requirements(self):
    # depending on the platform or the tools.system.package_manager:tool configuration
    # only one of these will be executed
    Apt(self).install(["libgl-dev"])
    Yum(self).install(["libglvnd-devel"])
    PacMan(self).install(["libglvnd"])
    Zypper(self).install(["Mesa-libGL-devel"])

Conan 会通过查看操作系统名称自动选择要使用的包管理器。在上面的示例中,如果我们运行在 Ubuntu Linux 上,Conan 将会忽略所有调用,除了 Apt() 调用,并且只会尝试使用 apt-get 工具安装包。

package_manager 工具允许您使用 `<package-name>=<package-version>` 的格式指定要安装的系统包的版本,例如 `Apt(self).install(["libgl-dev=0.0.1"])`。支持版本的系统包管理器有 AptYumDnfBrewPkgChocolateyApkZypper。在包管理器不支持版本控制的系统上(例如 PacManPkgUtil),提供的版本将被忽略。

Conan 默认使用以下映射:

  • Apt 用于 **Linux**,发行版名称包括:ubuntudebianraspbianlinuxmint

  • Yum 用于 **Linux**,发行版名称包括:pidorascientificxenserveramazonoracleamznalmalinuxrocky

  • Dnf 用于 **Linux**,发行版名称包括:fedorarhelcentosmageia

  • Apk 用于 **Linux**,发行版名称包括:alpine

  • Brew 用于 **macOS**

  • PacMan 用于 **Linux**,发行版名称包括:archmanjaro,以及在 **Windows** 上使用 msys2

  • Chocolatey 用于 **Windows**

  • Zypper 用于 **Linux**,发行版名称包括:opensusesles

  • Pkg 用于 **FreeBSD**

  • PkgUtil 用于 **Solaris**

您可以通过设置配置属性 tools.system.package_manager:tool 来覆盖此默认映射并设置您想要默认使用的包管理器工具。

系统包管理器工具可用的方法

所有这些包装器都共享三个方法,代表了与系统包管理器进行的最常见操作。对于除了 Apt 之外的所有包管理器,它们的形式都相同,而 Apt 还为其 install 方法 接受 recommends 参数。

  • install(self, packages, update=False, check=True, host_package=True): 尝试安装作为参数传递的包列表。如果参数 checkTrue,它会在安装之前检查这些包是否已安装。如果参数 updateTrue,它会在检查和安装之前尝试更新包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。如果参数 host_packageTrue,它将为宿主机器架构(将运行软件的机器)安装包,这在交叉构建时有效。此方法将返回执行命令的返回码。

  • install_substitutes(packages_substitutes, update=False, check=True):尝试安装作为参数传递的替代包列表之一,例如,`install_substitutes(["pkg1", "pkg2"], ["pkg3"])`。如果其中一个替代包列表被完全安装,则成功,因此它旨在用于您为不同发行版有不同包的情况。在此示例中,它将首先尝试安装 `pkg1` 和 `pkg2`,如果成功安装这两个包,它将停止。如果失败,它将继续处理下一个列表并尝试安装 `pkg3`。在内部,它调用前面的 `install(packages, update=update, check=check)` 方法,因此 `update` 和 `check` 具有与上面相同的目的。

  • update():更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

  • check(packages):检查作为参数传递的包列表是否已安装。它将返回一个包含缺失包的列表。

影响系统包管理器调用的配置属性

如上所述,有几个 `[conf]` 影响这些工具的调用方式:

  • tools.system.package_manager:tool:用于选择您想要默认使用的包管理器工具:`"apk"`、`"apt-get"`、`"yum"`、`"dnf"`、`"brew"`、`"pacman"`、`"choco"`、`"zypper"`、`"pkg"` 或 `"pkgutil"`

  • tools.system.package_manager:mode:调用包管理器工具时使用的模式。有两种可能的值:

    • "check":最多只检查缺失的包,并且在任何情况下都不会尝试更新包管理器数据库或安装任何包。如果系统中缺少必需的包,它将引发错误。这是默认值。

    • "report":仅捕获 `.install()` 调用以捕获包,但不检查或安装它们。绝不引发错误。主要用于 `conan graph info` 命令。

    • "report-installed":报告(而不失败)需要哪些包(与 `report` 相同),并检查当前系统中实际安装了哪些包。

    • "install":它将允许 Conan 执行更新或安装操作。

  • tools.system.package_manager:sudo:在 Linux 上调用包管理器工具时使用 sudo(默认值为 False)。

  • tools.system.package_manager:sudo_askpass:在 Linux 上使用 sudo 调用系统包管理器时使用 `-A` 参数(默认值为 False)。

这些工具还有一些特定的参数。这是完整参考:

conan.tools.system.package_manager.Apk

将调用 apk 命令。在 **Linux** 上,对于发行版名称:alpine 默认启用。

参考

class Apk(conanfile, _arch_names=None)

构造函数。请注意,Apk 不支持架构名称,因为 Alpine Linux 不支持多架构。因此,arch_names 参数将被忽略。

参数:

conanfile – 当前配方对象。始终使用 self

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

Alpine Linux 不支持同一存储库中的多个架构,因此 Conan 架构与 Alpine 架构之间没有映射。

conan.tools.system.package_manager.Apt

将调用 apt-get 命令。在 **Linux** 上,对于发行版名称:ubuntudebianraspbianlinuxmint 默认启用。

参考

class Apt(conanfile, arch_names=None)
参数:
  • conanfile – 当前的配方对象。始终使用 self

  • arch_names – 此参数将 Conan 架构设置映射到包管理器工具的架构名称。默认情况下为 None,这意味着它将使用最常见架构的默认映射。例如,如果您使用的是 x86_64 Conan 架构设置,它将此值映射到 Aptamd64,并尝试安装 `<package_name>:amd64` 包。

install(packages, update=False, check=True, recommends=False, host_package=True)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

  • host_package – 为宿主机器架构(将运行软件的机器)安装包,这在交叉构建时有效。

  • recommends – 如果参数 recommendsFalse,它将在 apt-get 命令调用中添加 `'--no-install-recommends'` 参数。

返回:

执行的 apt 命令的返回码。

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

您可以将 arch_names 参数传递给,像这样覆盖默认的 Conan 映射:

conanfile.py
...
def system_requirements(self):
    apt = Apt(self, arch_names={"<conan_arch_setting>": "apt_arch_setting"})
    apt.install(["libgl-dev"])

Conan 为 APT 包架构使用的默认映射是:

self._arch_names = {"x86_64": "amd64",
                    "x86": "i386",
                    "ppc32": "powerpc",
                    "ppc64le": "ppc64el",
                    "armv7": "arm",
                    "armv7hf": "armhf",
                    "armv8": "arm64",
                    "s390x": "s390x"} if arch_names is None else arch_names

conan.tools.system.package_manager.Yum

将调用 yum 命令。在 **Linux** 上,对于发行版名称:pidorascientificxenserveramazonoracleamznalmalinux 默认启用。

参考

class Yum(conanfile, arch_names=None)
参数:
  • conanfile – 当前配方对象。始终使用 self

  • arch_names – 此参数将 Conan 架构设置映射到包管理器工具的架构名称。默认情况下为 None,这意味着它将使用最常见架构的默认映射。例如,如果您使用的是 x86 Conan 架构设置,它将此值映射到 Yumi?86,并尝试安装 `<package_name>.i?86` 包。

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

Conan 为 Yum 包架构使用的默认映射是:

self._arch_names = {"x86_64": "x86_64",
                    "x86": "i?86",
                    "ppc32": "powerpc",
                    "ppc64le": "ppc64le",
                    "armv7": "armv7",
                    "armv7hf": "armv7hl",
                    "armv8": "aarch64",
                    "s390x": "s390x"} if arch_names is None else arch_names

conan.tools.system.package_manager.Dnf

将调用 dnf 命令。在 **Linux** 上,对于发行版名称:fedorarhelcentosmageia 默认启用。此工具与 Yum 工具具有完全相同的默认值、构造函数和方法。

conan.tools.system.package_manager.PacMan

将调用 pacman 命令。在 **Linux** 上,对于发行版名称:archmanjaro,以及在 **Windows** 上使用 msys2 时默认启用。

参考

class PacMan(conanfile, arch_names=None)
参数:
  • conanfile – 当前配方对象。始终使用 self

  • arch_names – 此参数将 Conan 架构设置映射到包管理器工具的架构名称。默认情况下为 None,这意味着它将使用最常见架构的默认映射。如果您使用的是 x86 Conan 架构设置,它将此值映射到 PacManlib32,并尝试安装 `<package_name>-lib32` 包。

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

Conan 为 PacMan 包架构使用的默认映射是:

self._arch_names = {"x86": "lib32"} if arch_names is None else arch_names

conan.tools.system.package_manager.Zypper

将调用 zypper 命令。在 **Linux** 上,对于发行版名称:opensusesles 默认启用。

参考

class Zypper(conanfile)
参数:

conanfile – 当前的配方对象。始终使用 self

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

conan.tools.system.package_manager.Brew

将调用 brew 命令。在 **macOS** 上默认启用。

参考

class Brew(conanfile)
参数:

conanfile – 当前的配方对象。始终使用 self

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

conan.tools.system.package_manager.Pkg

将调用 pkg 命令。在 **Linux** 上,对于发行版名称:freebsd 默认启用。

参考

class Pkg(conanfile)
参数:

conanfile – 当前的配方对象。始终使用 self

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

conan.tools.system.package_manager.PkgUtil

将调用 pkgutil 命令。在 **Solaris** 上默认启用。

参考

class PkgUtil(conanfile)
参数:

conanfile – 当前的配方对象。始终使用 self

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。

conan.tools.system.package_manager.Chocolatey

将调用 choco 命令。在 **Windows** 上默认启用。

参考

class Chocolatey(conanfile)
参数:

conanfile – 当前的配方对象。始终使用 self

check(*args, **kwargs)

检查作为参数传递的包列表是否已安装。

参数:

packages – 要检查的包列表。

返回:

在系统中未安装的包列表(来自 packages 参数)。

install(*args, **kwargs)

将尝试安装作为参数传递的包列表。其行为受 tools.system.package_manager:mode 配置 的值影响。

参数:
  • packages – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

install_substitutes(*args, **kwargs)

将尝试使用作为可变数量参数传递的多个包列表调用 install() 方法。这很有用,例如,包的名称因发行版或发行版版本而异。例如,Aptlibxcb 在 Ubuntu >= 15.0 中名为 libxcb-util-dev,而在其他版本中名为 libxcb-util0-dev。您可以调用:

# will install the first list of packages that succeeds in the installation
Apt.install_substitutes(["libxcb-util-dev"], ["libxcb-util0-dev"])
参数:
  • packages_alternatives – 尝试安装作为参数传递的包列表。

  • update – 在检查和安装之前尝试更新包管理器数据库。

  • check – 在安装之前检查包是否已安装。

返回:

执行的包管理器命令的返回码。

update(*args, **kwargs)

更新系统包管理器数据库。其行为受 tools.system.package_manager:mode 配置 的值影响。

返回:

执行的包管理器更新命令的返回码。