处理版本范围和预发布¶
在开发软件包并使用版本范围定义依赖项时,有时会出现依赖项的新版本发布新的预发布版本,我们希望在新版本发布之前进行测试,以便有机会提前验证新版本。
乍一看,可能会预期如果新版本与我们的范围相交,它就会匹配,但是正如版本范围教程中描述的那样,默认情况下,Conan 不会将预发布版本与未明确指定预发布版本的范围匹配。
Conan 提供了 global.conf core.version_ranges:resolve_prereleases
配置,这是一个三态配置选项,用于控制版本范围是否应解析为预发布版本。
当未设置时,默认行为是遵循版本范围表达式,并且仅当版本范围明确允许预发布版本时才匹配,例如 [>=1 <2, include_prerelease]
。
如果未指定 include_prerelease
标志,则在这种情况下将忽略预发布版本。
当设置为 False
时,即使版本范围表达式允许,它也不会匹配预发布版本。
当设置为 True
时,它会在版本范围中全局启用预发布匹配,即使版本范围表达式没有明确允许。这避免了修改和导出依赖图的配方,对于大型依赖图来说,这变得不可行。
此配置的额外好处是会影响整个依赖图,因此,如果我们的任何依赖项也定义了对我们感兴趣的库的需求,新版本也将被其选取。
让我们看看这在实际中如何运作。假设我们有以下(总结的)依赖图,其中我们依赖于 libpng
和 libmysqlclient
,它们都通过 [>1.2 <2]
版本范围依赖于 zlib
如果现在发布了 zlib/1.3-pre
,使用它就像修改你的 global.conf 文件并添加行 core.version_ranges:resolve_prereleases=True
(或将 --core-conf core.version_ranges:resolve_prereleases=True
CLI 参数添加到你的命令调用中)一样简单,之后,运行 conan create
将输出所使用的 zlib
的预期预发布版本
...
======== Computing dependency graph ========
Graph root
cli
Requirements
libmysqlclient/8.1.0#493d36bd9641e15993479706dea3c341 - Cache
libpng/1.6.40#2ba025f1324ff820cf68c9e9c94b7772 - Cache
lz4/1.9.4#b572cad582ca4d39c0fccb5185fbb691 - Cache
openssl/3.1.2#f2eb8e67d3f5513e8a9b5e3b62d87ea1 - Cache
zlib/1.3-pre#f2eb8e6ve24ff825bca32bea494b77dd - Cache
zstd/1.5.5#54d99a44717a7ff82e9d37f9b6ff415c - Cache
Build requirements
cmake/3.27.1#de7930d308bf5edde100f2b1624841d9 - Cache
Resolved version ranges
cmake/[>=3.18 <4]: cmake/3.27.1
openssl/[>=1.1 <4]: openssl/3.1.2
zlib/[>1.2 <2]: zlib/1.3-pre
...
现在我们的软件包可以针对这个新版本进行测试和验证,测试结束后可以删除该配置,以恢复到 Conan 的常规行为。