仅在构建包时使用系统依赖¶
在某些情况下,您可能希望仅在构建包时使用系统依赖,而不是在安装包时使用。这在您希望在 CI/CD 流水线中构建包,但又不想在不同环境中安装 Conan 包时运行系统包管理器的情况下非常有用。对于这些情况,有几种方法可以用来实现这一目标。
将系统包的 Conan 包装包作为构建依赖使用¶
在此方法中,您可以为包装的系统包使用 Conan 包。然后,可以通过方法build_requirements()正常地使用该包。
from conan import ConanFile
class MyPackage(ConanFile):
name = "mypackage"
settings = "os", "compiler", "build_type", "arch"
def build_requirements(self):
self.tool_requires("ncurses/system")
...
这确保了包 mypackage 的下游消费者不会直接调用系统包管理器(例如 apt-get)。只有 ncurses
的系统包装包的直接消费者在构建包时才会执行系统包管理器。
将 ncurses
集中并包装在一个独立的 recipe 中,使其可以在多个场景下重复使用,并且是避免代码重复的良好实践。
在 build() 方法中直接使用系统包¶
如果您希望仅在构建包时运行系统包管理器,但没有 Conan 包来包装系统库信息,则可以在 build() 方法中运行系统包管理器
from conan import ConanFile
from conan.tools.system import package_manager
class MyPackage(ConanFile):
settings = "os", "compiler", "build_type", "arch"
...
def build(self):
if self.settings.os == "Linux":
apt = package_manager.Apt(self)
apt.install(["libncurses-dev"], update=True, check=True)
通过这种方式,系统包管理器只会在构建包时被调用,而不会在安装包时被调用。这样做的好处是不需要创建一个独立的 Conan 包来包装系统库信息,这对于只需要单个 recipe 安装系统包的情况来说,是一个更简单的方法。
尽管如此,如果多个 recipe 使用相同的系统包,这种方法可能导致代码重复。建议谨慎使用此方法,仅用于良好包含的场景。