system_requirements()

system_requirements() 方法可以用于调用系统包管理器,以在系统级别安装软件包。 通常,这应该减少到最低限度,系统包不是建模的依赖项,但有时可以方便地自动化安装某些 Conan 包所需的某些系统包。 例如,当创建一个 recipe 来打包 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": []
                 }
             },

即使不安装二进制文件也可以获得类似的结果,我们可以使用 reportreport-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"
        ]
    }
}