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 工具安装软件包。 默认情况下,Conan 使用以下映射

  • Linux 上的 Apt,带有发行版名称:ubuntudebianraspbianlinuxmint

  • Linux 上的 Yum,带有发行版名称:pidorascientificxenserveramazonoracleamznalmalinuxrocky

  • Linux 上的 Dnf,带有发行版名称:fedorarhelcentosmageia

  • Linux 上的 Apk,带有发行版名称:alpine

  • macOS 上的 Brew

  • Linux 上的 PacMan,带有发行版名称:archmanjaro,以及在使用 Windowsmsys2

  • Windows 上的 Chocolatey

  • Linux 上的 Zypper,带有发行版名称:opensusesles

  • FreeBSD 上的 Pkg

  • Solaris 上的 PkgUtil

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

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

所有这些封装器共享三种方法,它们代表了系统包管理器的最常见操作。 它们对所有包管理器采用相同的形式,除了 Apt,它也接受 安装方法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): 尝试安装作为参数传递的替代包的列表,例如,[["pkg1", "pkg2"], ["pkg3"]]。 如果其中一个替代列表已完全安装,则它会成功,因此它旨在用于您为不同的发行版提供不同的软件包时。 在内部,它调用先前的 install(packages, update=update, check=check) 方法,因此 updatecheck 的目的与上述相同。

  • 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 – 当前 recipe 对象。 始终使用 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,它会将 '--no-install-recommends' 参数添加到 apt-get 命令调用中。

返回值:

已执行的 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": "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.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 启用:opensuse, sles

参考

class Zypper(conanfile)
参数:

conanfile – 当前 recipe 对象。 始终使用 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 – 当前 recipe 对象。 始终使用 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 – 当前 recipe 对象。 始终使用 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 – 当前 recipe 对象。 始终使用 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 – 当前 recipe 对象。 始终使用 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 配置 的值的影响。

返回值:

已执行的软件包管理器更新命令的返回代码。