build_id()¶
build_id()
方法允许重用相同的构建来在缓存中创建不同的二进制包,从而潜在地节省构建时间,因为它能避免一些不必要的重新构建。因此,它是一种优化方法。
在一般情况下,每个二进制包都有一个构建文件夹,具有与该包完全相同的 package_id
。但是,这种行为是可以改变的,在几种情况下这可能会很有用:
包构建脚本一次生成多个不同的配置(例如调试和发布构件),而无法分别构建每个配置。
包构建脚本生成一个二进制配置,但可以单独打包不同的构件。 例如,如果有一些测试可执行文件,您可能想要创建两个包:一个仅包含用于常规用途的库,另一个也包含测试(用于合规性、以后的可重现性、调试等)。
在第一种情况下,我们可以例如写:
settings = "os", "compiler", "arch", "build_type"
def build_id(self):
self.info_build.settings.build_type = "Any"
此配方将为调试和发布配置生成具有不同 package_id
的最终不同包。但是,由于 build_id()
将为任何 build_type
生成相同的 build_id
,因此只会执行一个文件夹和一个 build()
,构建调试和发布构件,然后会为每个配置调用 package()
方法,并且它应根据 self.settings.build_type
值有条件地打包构件。如果使用不同的编译器或架构,仍将执行不同的构建。
还可以更改其他信息,例如自定义包选项:
def build_id(self):
self.info_build.options.myoption = 'MyValue' # any value possible
self.info_build.options.fullsource = 'Always'
如果 build_id()
方法不修改 info_build
数据,并且它仍然产生与 package_id
不同的 ID,则将应用标准行为。 考虑以下情况:
settings = "os", "compiler", "arch", "build_type"
def build_id(self):
if self.settings.os == "Windows":
self.info_build.settings.build_type = "Any"
如果包是 Windows 包,这只会产生不同的 build_id
,因此对于所有 build_type
值只运行一次 build()
。 在任何其他操作系统中的行为将是标准的,就像未定义 build_id()
方法一样,为每个 build_type
运行一个不同的 build()
。
注意
最佳实践
Conan 强烈建议为每个不同的配置使用一个具有自己 package_id
的包二进制文件。 build_id()
方法的目标是处理遗留的构建脚本,这些脚本不容易更改为每次构建一个配置。