conan.tools.system.package_manager¶
conan.tools.system.package_manager 下的工具是针对不同平台上一些最流行的系统包管理器进行的封装。您可以在配方中使用它们来调用系统包管理器,并执行最典型的操作,例如安装软件包、更新包管理器数据库或检查软件包是否已安装。默认情况下,调用这些工具时不会尝试在系统上安装任何内容,要更改此行为,您可以设置 tools.system.package_manager:mode 配置 的值。
您可以在配方的 system_requirements() 方法中使用这些工具,例如:
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"])。支持版本的系统包管理器有 Apt、Yum、Dnf、Brew、Pkg、Chocolatey、Apk 和 Zypper。在我们这里,对于不支持版本控制的包管理器(如 PacMan 和 PkgUtil),提供的版本将被忽略。
Conan 默认使用以下映射:
Apt 用于 **Linux**,发行版名称为:ubuntu、debian、raspbian 或 linuxmint
Yum 用于 **Linux**,发行版名称为:pidora、scientific、xenserver、amazon、oracle、amzn、almalinux 或 rocky
Dnf 用于 **Linux**,发行版名称为:fedora、rhel、centos、mageia
Apk 用于 **Linux**,发行版名称为:alpine
Brew 用于 **macOS**
PacMan 用于 **Linux**,发行版名称为:arch、manjaro,以及在 **Windows** 上使用 msys2 时
Chocolatey 用于 **Windows**
Zypper 用于 **Linux**,发行版名称为:opensuse、sles
Pkg 用于 **FreeBSD**
PkgUtil 用于 **Solaris**
您可以覆盖此默认映射,并通过设置配置属性 tools.system.package_manager:tool 来指定您想默认使用的包管理器工具。
系统包管理器工具可用的方法¶
所有这些封装器都共享三种方法,它们代表了与系统包管理器进行的最常见操作。除了 install 方法 接受 recommends 参数外,它们对于所有包管理器都采用相同的形式。
install(self, packages, update=False, check=True, host_package=True):尝试安装作为参数传递的软件包列表。如果参数check为True,它会在安装之前检查这些软件包是否已安装。如果参数update为True,它会在检查和安装之前尝试更新包管理器数据库。其行为受tools.system.package_manager:mode配置 值的影响。如果参数host_package为True,它将为宿主机器架构(将运行软件的机器)安装软件包,当交叉构建时会产生效果。此方法将返回已执行命令的返回码。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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
Alpine Linux 不支持同一存储库中的多个架构,因此 Conan 架构与 Alpine 架构之间没有映射。
conan.tools.system.package_manager.Apt¶
将调用 apt-get 命令。默认情况下为 **Linux** 启用,发行版名称为:ubuntu、debian、raspbian 和 linuxmint。
参考¶
- class Apt(conanfile, arch_names=None)¶
- 参数:
conanfile – 当前的配方对象。始终使用
self。arch_names – 此参数将 Conan 架构设置映射到包管理器工具的架构名称。默认情况下为
None,这意味着它将使用最常见架构的默认映射。例如,如果您使用x86_64Conan 架构设置,它将映射到 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 – 如果参数
recommends为False,它将在 apt-get 命令调用中添加'--no-install-recommends'参数。
- 返回:
已执行的 apt 命令的返回码。
- check(*args, **kwargs)¶
检查作为参数传递的软件包列表是否已安装。
- 参数:
packages – 要检查的软件包列表。
- 返回:
从
packages参数中获取的在系统中未安装的软件包列表。
- install_substitutes(*args, **kwargs)¶
将尝试使用作为可变数量参数传递的多个软件包列表调用 install() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
您可以通过以下方式将 arch_names 参数传递给 Apt 工具来覆盖默认的 Conan 映射:
...
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** 启用,发行版名称为:pidora、scientific、xenserver、amazon、oracle、amzn 和 almalinux。
参考¶
- class Yum(conanfile, arch_names=None)¶
- 参数:
conanfile – 当前配方对象。始终使用
self。arch_names – 此参数将 Conan 架构设置映射到包管理器工具的架构名称。默认情况下为
None,这意味着它将使用最常见架构的默认映射。例如,如果您使用x86Conan 架构设置,它将映射到 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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
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** 启用,发行版名称为:fedora、rhel、centos 和 mageia。此工具与 Yum 工具具有完全相同的默认值、构造函数和方法。
conan.tools.system.package_manager.PacMan¶
将调用 pacman 命令。默认情况下为 **Linux** 启用,发行版名称为:arch、manjaro,以及在 **Windows** 上使用 msys2 时。
参考¶
- class PacMan(conanfile, arch_names=None)¶
- 参数:
conanfile – 当前配方对象。始终使用
self。arch_names – 此参数将 Conan 架构设置映射到包管理器工具的架构名称。默认情况下为
None,这意味着它将使用最常见架构的默认映射。如果您使用x86Conan 架构设置,它将映射到 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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
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 – 当前的配方对象。始终使用
self。
- check(*args, **kwargs)¶
检查作为参数传递的软件包列表是否已安装。
- 参数:
packages – 要检查的软件包列表。
- 返回:
从
packages参数中获取的在系统中未安装的软件包列表。
- install(*args, **kwargs)¶
将尝试安装作为参数传递的软件包列表。其行为受
tools.system.package_manager:mode配置 值的影响。- 参数:
packages – 尝试安装作为参数传递的软件包列表。
update – 在检查和安装之前尝试更新包管理器数据库。
check – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
- install_substitutes(*args, **kwargs)¶
将尝试使用作为可变数量参数传递的多个软件包列表调用 install() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。
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() 方法。这很有用,例如,当一个软件包在不同发行版或发行版版本中的名称不同时。例如,Ubuntu >= 15.0 上的
Apt的libxcb包名为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 – 在安装之前检查软件包是否已安装。
- 返回:
已执行的包管理器命令的返回码。