conan.tools.system.package_manager

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

您可以在 recipe 的 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 默认使用以下映射

  • *Apt* 用于发行版名称为 *ubuntu*、*debian*、*raspbian* 或 *linuxmint* 的 Linux

  • *Yum* 用于发行版名称为 *pidora*、*scientific*、*xenserver*、*amazon*、*oracle*、*amzn*、*almalinux* 或 *rocky* 的 Linux

  • *Dnf* 用于发行版名称为 *fedora*、*rhel*、*centos*、*mageia* 的 Linux

  • *Apk* 用于发行版名称为 *alpine* 的 **Linux**

  • *Brew* 用于 **macOS**

  • *PacMan* 用于发行版名称为 *arch*、*manjaro* 的 **Linux** 以及使用 *msys2* 的 **Windows**

  • *Chocolatey* 用于 **Windows**

  • *Zypper* 用于发行版名称为 *opensuse*、*sles* 的 **Linux**

  • *Pkg* 用于 **FreeBSD**

  • *PkgUtil* 用于 **Solaris**

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

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

所有这些封装共享代表系统包管理器最常见操作的三个方法。除 *Apt* 外,它们对所有包管理器都采用相同的形式,*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* 命令。默认为发行版名称为 *alpine* 的 **Linux** 启用。

参考

class Apk(conanfile, _arch_names=None)

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

参数:

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 配置的值影响。

返回:

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

Alpine Linux 在同一个仓库中不支持多种架构,因此没有从 Conan 架构到 Alpine 架构的映射。

conan.tools.system.package_manager.Apt

将调用 *apt-get* 命令。默认为发行版名称为 *ubuntu*、*debian*、*raspbian* 和 *linuxmint* 的 **Linux** 启用。

参考

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

  • arch_names – 此参数将 Conan 架构设置与包管理器工具架构名称进行映射。默认为 None,这意味着它将对最常见的架构使用默认映射。例如,如果您使用 x86_64 Conan 架构设置,它将把此值映射到 *Apt* 的 amd64,并尝试安装 <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": "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* 命令。默认为发行版名称为 *pidora*、*scientific*、*xenserver*、*amazon*、*oracle*、*amzn* 和 *almalinux* 的 **Linux** 启用。

参考

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

  • arch_names – 此参数将 Conan 架构设置与包管理器工具架构名称进行映射。默认为 None,这意味着它将对最常见的架构使用默认映射。例如,如果您使用 x86 Conan 架构设置,它将把此值映射到 *Yum* 的 i?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* 命令。默认为发行版名称为 *fedora*、*rhel*、*centos* 和 *mageia* 的 **Linux** 启用。此工具具有与 Yum 工具完全相同的默认值、构造函数和方法。

conan.tools.system.package_manager.PacMan

将调用 *pacman* 命令。默认为发行版名称为 *arch*、*manjaro* 的 **Linux** 以及使用 *msys2* 的 **Windows** 启用

参考

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

  • arch_names – 此参数将 Conan 架构设置与包管理器工具架构名称进行映射。默认为 None,这意味着它将对最常见的架构使用默认映射。如果您使用 x86 Conan 架构设置,它将把此值映射到 *PacMan* 的 lib32,并尝试安装 <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* 命令。默认为发行版名称为 *opensuse*、*sles* 的 **Linux** 启用。

参考

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* 命令。默认为 **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 配置的值影响。

返回:

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