conan中开启Package Revisions

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

发表回复