Package Revisions的目的是为了让上传的二进制包不会互相覆盖,然后用conan.lock对二进制包版本(PRev)进行锁定实现构建的稳定性。这导致了一些行为上的变化,需要特别注意。
Package Revisions字面意思是包修订,这里指的是同一个包不同的二进制rev可以同时存储在conan仓库中。
配置
- 方法1
conan config set general.revisions_enabled=1
conan config set general.full_transitive_package_id=1
- 方法2
在conan.conf的general段中配置
revisions_enabled=1
full_transitive_package_id=1
- 方法3
配置环境变量
CONAN_REVISIONS_ENABLED=1
说明
- full_transitive_package_id=1是conan2中的默认行为,是官方推荐的配置-
- 当rev版本不同时不会被覆盖
- 包的package id由包名,版本号,settings,options,requires共同决定
- 包的PRev由包的内容hash组成
- 包的RRev由conanfile.py的hash组成
- 在conan2中Package Revisions是默认开启的,不用另外配置
- jfrog artifactory版本大于等于6.9
- conan客户端版本大于等于1.13
- artifactory中revision特性是默认开启的(不可关闭),conan2中也是默认开启的(不可关闭),而且服务端与客户端必须一致(同时开启同时关闭)
- 当conanfile.py改变时(RREV改变)或源代码改变时(如果需要上传源代码时)所有不同架构二进制包要重新编译,不然conan会找不到未重编译架构的二进制包,这是因为默认conan只查找最后一次的RREV下的二进制包
比如修改版本号,requires等都会修改conanfile.py文件,这时候就需要重新上传所有的二进制包。另外不同的换行符格式,不同的空白符号也会导致Conanfile.py文件的hash不一样(hash就是RREV)。
英文原话:
If you generate and upload N binary packages for a recipe with a given revision, then if you modify the recipe, and thus the recipe revision, you need to build and upload N new binaries matching that new recipe revision.
如果不想重新上传所有二进制包,则需要明确指定所要引用的RRev版本,而不是使用最新的RRev如:
self.requires("hello/1.0#2475ece651f666f42c155623228c75d2")
https://docs.conan.io/1/versioning/revisions.html
查看conan仓库中的包(conan2)
- 列出所有RRev
conan list hello/1.1#* -r conan - 列出指定RRev的二进制包
conan list hello/1.1#2d62851f23cc70eb930774045906cd5d:* -r conan - 列出最新RRev的二进制包
conan list hello/1.1:* -r conan