默认的package_id()
直接使用所定义的 settings
和 options
,并假定在 require
中定义了依赖项的语义版本控制。
可以覆盖此package_id()
方法来控制包ID的生成。在package_id()
中,我们可以访问self.Info
对象,该对象经过散列以计算二进制ID,并包含:
- self.Info.settings: 包含所有声明的设置,始终作为字符串值。我们可以访问/修改设置,例如
self.info.settings.compiler.version
。 - self.Info.options: 包含所有声明的选项,也始终作为字符串值,例如,
self.Info.options.shared
。
最初,此 info
对象包含原始设置和选项,但可以不受任何其他字符串值的约束地对其进行更改。
例如,如果您确定您的软件包ABI兼容性对于> 4.5和<5.0的GCC版本来说是很好的,则可以执行以下操作:
from conans import ConanFile, CMake, tools
from conans.model.version import Version
class PkgConan(ConanFile):
name = "pkg"
version = "1.0"
settings = "compiler", "build_type"
def package_id(self):
v = Version(str(self.settings.compiler.version))
if self.settings.compiler == "gcc" and (v >= "4.5" and v < "5.0"):
self.info.settings.compiler.version = "GCC version between 4.5 and 5.0"
我们使用任意字符串设置了self.info.settings.compiler.version
,该字符串的值并不重要(可以是任何字符串)。 唯一重要的是,对于4.5到5.0之间的任何GCC版本,它都是相同的。 对于所有这些版本,编译器版本将始终哈希为相同的ID。
让我们尝试使用GCC 4.5 时它是否正常工作:
$ conan create . pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.5 ...
Requirements
pkg/1.0@myuser/mychannel from local
Packages
pkg/1.0@myuser/mychannel:af044f9619574eceb8e1cca737a64bdad88246ad
...
我们可以看到,计算出的包ID是af04 ... 46ad
(不是真实的)。 如果我们指定GCC 4.6会发生什么?
$ conan install pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.6 ...
Requirements
pkg/1.0@myuser/mychannel from local
Packages
pkg/1.0@myuser/mychannel:af044f9619574eceb8e1cca737a64bdad88246ad
他要求包装再次在af04 ... 46ad
中具有相同的结果。 现在我们可以尝试使用GCC 4.4(<4.5):
$ conan install Pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.4 ...
Requirements
pkg/1.0@myuser/mychannel from local
Packages
pkg/1.0@myuser/mychannel:7d02dc01581029782b59dcc8c9783a73ab3c22dd
计算出的软件包ID是不同的,这意味着我们需要针对GCC 4.4的提供不同二进制软件包。
与调整self.info.settings
的方式相同,如果需要,我们可以设置self.info.options
值。
:::info
See also
检查package_id()以查看可用的帮助程序方法,并更改其行为,例如:
- 配方仅包含头文件。
- 调整Visual Studio工具集的兼容性。 :::