仅在构建包时使用系统需求¶
在某些情况下,您可能希望仅在构建包时使用系统需求,而不是在安装包时使用。 当您想在 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
的系统包装包的直接包使用者才会在构建包时执行系统包管理器。
在单独的 recipe 中集中和包装 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 包来包装系统库信息,这是一个更简单的情况,仅需要单个 recipe 来安装系统包。
尽管如此,如果多个 recipe 使用相同的系统包,此方法可能会导致代码重复。 建议谨慎使用此方法,仅用于包含良好的情况。