仅在构建包时消耗系统要求¶
在某些情况下,您可能只想在构建包时消耗系统要求,而在安装包时不消耗。当您想在 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
集中并包装在一个单独的配方中,使其可在多种情况下重用,并且是避免代码重复的好做法。
直接在 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 包来包装系统库信息,这是一种更简单的情况,当只有一个配方需要安装系统包时。
然而,如果多个配方消耗相同的系统包,这种方法可能会导致代码重复。建议谨慎使用此方法,并且仅用于界限清晰的场景。