system_requirements()¶
`system_requirements()` 方法可用于调用系统包管理器以在系统级别安装包。通常,应尽量减少这种情况,系统包不是建模的依赖项,但有时可以方便地自动安装一些 Conan 包所需的系统包。例如,在创建用于打包 `opencv` 库的配方时,我们可能会意识到它在 Linux 上需要 `gtk` 库,但我们可能不希望为它们创建一个包,因为我们希望确保使用系统自带的库。我们代码
from conan import ConanFile
from conan.tools.system.package_manager import Apt
class OpenCV(ConanFile):
name = "opencv"
version = "4.0"
def system_requirements(self):
apt = Apt(self)
apt.install(["libgtk-3-dev"], update=True, check=True)
有关不同系统包管理器的内置助手的完整参考,请阅读 tools.system.package_manager 文档。
收集系统需求¶
当 `system_requirements()` 使用一些内置的 `package_manager` 助手时,可以收集有关已安装或所需的系统需求的信息。如果我们有以下 `conanfile.py
from conan import ConanFile
from conan.tools.system.package_manager import Apt
class MyPkg(ConanFile):
settings = "arch"
def system_requirements(self):
apt = Apt(self)
apt.install(["pkg1", "pkg2"])
可以使用以下命令显示已安装的系统包(使用默认 `tools.system.package_manager:mode,将检查需求,但不会安装)
# Assuming apt is the default or using explicitly
# -c tools.system.package_manager:tool=apt-get
$ conan install . --format=json
"graph": {
"nodes": [
{
"ref": "",
"id": 0,
"settings": {
"arch": "x86_64"
},
"system_requires": {
"apt-get": {
"install": [
"pkg1",
"pkg2"
],
"missing": []
}
},
即使不安装二进制文件,也可以获得类似的结果,我们可以使用 `report` 或 `report-installed` 模式。`report` 模式显示 `install` 包,这些是需要安装的包,无论它们是否实际安装。`report` 模式不会检查系统中的这些包,因此即使在另一个操作系统中也可以运行它
$ conan graph info . -c tools.system.package_manager:mode=report --format=json
...
"system_requires": {
"apt-get": {
"install": [
"pkg1",
"pkg2"
]
}
}
另一方面,`report-installed` 模式将检查包是否已安装在系统中,但如果未找到,则不会失败或引发任何错误
$ conan graph info . -c tools.system.package_manager:mode=report-installed --format=json
...
"system_requires": {
"apt-get": {
"install": [
"pkg1",
"pkg2"
],
"missing": [
"pkg1",
"pkg2"
]
}
}
构建时系统需求¶
在某些情况下,可能某些系统需求仅在构建时才需要。对于这些场景,有两种可能性
将安装构建时系统需求的逻辑添加到不同的方法中,例如 `
build()` 方法或 `generate()` 方法。将安装和构建时系统需求的逻辑包装到它自己的包配方中,并使用该配方作为 `
tool_requires`。
在这一部分中有构建时系统需求的示例