我们发布了 Conan 1.13 版本,这里为您提供新版本中一些实用功能的亮点介绍。让我们一起来看看吧!

配方和包版本修订

在几个版本之前,我们开始引入一些内部更改,以便适应新的版本修订概念。这是一个隐式创建同一版本包修订版本的方式,无需显式增加版本号。

在包和配方中引入此概念的主要动机是,在大多数开发 Conan 包的情况下,配方conanfile.py **遵循不同的开发周期**。例如,配方添加了在另一个操作系统上构建的支持。添加此更改可能不需要对库本身或构建系统进行任何更改,但是,为了反映此更改,您需要将配方上传到远程服务器,使用相同的引用(例如 lib/1.1.2@user/channel)并覆盖以前的版本。

这会给包的可追溯性带来问题(您会丢失旧版本 -实际上是“修订版本” -)并且无法回退到以前的状态。一些用户在生产环境中使用 Conan 时已经注意到了这一点,并开始在库版本的末尾附加提交哈希或数字,例如 lib/1.1.2-<commit-hash>@user/channel。虽然这解决了可追溯性问题,但它有一个缺点,即在每次依赖于更新版本的配方时都需要增加版本号。

我们意识到,为了使其正常工作,此行为应作为 Conan 模型的一部分来实现,这就是此版本包含 **第一个支持版本修订的 Conan 实验版本** 的原因!

版本修订解释

当前的 Conan 模型使用引用来描述与用户和通道创建的作用域关联的配方 <package_name>/<version>@<user_name>/<channel> 以及包 ID,它是用于识别二进制包的设置选项和要求的哈希值。

通常,要指示包的二进制包,您需要类似以下内容:<package_name>/<version>@<user_name>/<channel>:<package_id>

此模型没有改变,您仍然可以在命令和配方中使用此包引用。但是,我们添加了两个更多级别

  • 配方修订版本 (RREV):使用最新的 VCS 哈希值或配方清单(conanfile.py 以及导出的任何文件)的校验和生成的唯一 ID。
  • 包修订版本 (PREV):使用包清单(二进制包中存储的所有文件)的校验和生成的唯一 ID。

这意味着现在您可以通过编写引用和包 ID 以及配方和包修订版本来指向二进制包的确切修订版本:<package_name>/<version>@<user_name>/<channel>#<RREV>:<package_id>#<PREV>

使用版本修订

版本修订的概念主要在服务器端,所有配方修订版本和包修订版本都将存储在服务器端。在客户端(在 Conan 缓存中),我们一次只能拥有一个修订版本。

要在客户端尝试使用版本修订,您需要在环境中设置 CONAN_REVISIONS_ENABLED=1 或在配置文件中启用它。

$ conan config set general.revisions_enabled=True

您还需要将 conan_server 更新到 1.13,并且将在即将发布的 JFrog Artifactory 版本中得到完全支持。

现在,每次导出配方或创建包时,它都会获得一个新的修订版本。

$ conan create . user/channel
Exporting package recipe
...
IrrXML/1.2@user/channel: Folder: C:\Users\danimtb\.conan\data\IrrXML\1.2\user\channel\export
IrrXML/1.2@user/channel: Using git commit as the recipe revision: 681d7e590d2da0a164166f737a49cf32c735ee6c
...
Requirements
    IrrXML/1.2@user/channel from local cache - Cache
Packages
    IrrXML/1.2@user/channel:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Build
...
IrrXML/1.2@user/channel: Package '6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7' created

您可以像往常一样搜索创建的包,还可以搜索刚刚创建的配方修订版本。

$ conan search IrrXML/1.2@user/channel --revisions

Revisions for 'IrrXML/1.2@user/channel':
681d7e590d2da0a164166f737a49cf32c735ee6c (No time)

“(No time)” 输出只是导出时间的参考,但此时间将来自服务器。如果包含配方的存储库的提交发生更改,则将创建一个新的修订版本,它将替换客户端中的当前修订版本。但是,您可以将其上传到服务器,并且您将拥有不同的修订版本。

$ conan search IrrXML/1.2@user/channel --revisions --remote server

Revisions for 'IrrXML/1.2@user/channel' at remote 'conan-local':
72389507bbaab233bb3bad798432c19a05752ae7 (2019-03-11 14:26:25 UTC)
681d7e590d2da0a164166f737a49cf32c735ee6c (2019-03-11 13:42:50 UTC)

现在,任何安装或执行 conan install --update 的用户都将自动从服务器获取最新的修订版本。此外,他们还可以定位 **特定的配方修订版本**。

$ conan install IrrXML/1.2@user/channel#681d7e590d2da0a164166f737a49cf32c735ee6c --remote server --update
...
[==================================================] 372B/372B
IrrXML/1.2@user/channel: WARN: The package IrrXML/1.2@user/channel:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 doesn't belong to the installed recipe revision, removing folder
Installing package: IrrXML/1.2@user/channel
Requirements
    IrrXML/1.2@user/channel from 'conan-local' - Download
Packages
    IrrXML/1.2@user/channel:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Download
...

文档 中阅读有关版本修订的更多信息,并不要忘记我们欢迎任何反馈。

包 ID 版本控制模式

从一开始,Conan 就一直使用 语义版本控制 来计算每个二进制包的要求版本哈希值。这意味着包 libA/1.2.3libB/1.0.0 的依赖项,只有当版本的 major 部分更改时,才会更改 libB 的二进制哈希值。否则,它将哈希到相同的包 ID。

让我们检查一下

  • libA/1.2.3

    conanfile.py

    from conans import ConanFile
    
    class LibA(ConanFile):
        pass
    
    $ conan create conanfile.py libA/1.2.3@user/channel
    ...
    $ conan create conanfile.py libA/1.3.3@user/channel
    ...
    $ conan create conanfile.py libA/2.0.0@user/channel
    ...
    
  • libB/1.0.0:

    conanfile.py

    from conans import ConanFile
    
    class LibB(ConanFile):
        name = "libB"
        version = "1.0.0"
        requires = "libA/1.2.3@user/channel"
    
    $ conan info .
    ...
    libA/1.2.3@user/channel
        ID: 5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9
        BuildID: None
        Remote: None
        Recipe: Cache
        Revision: 7ee2bfe571d258167c9356f2d7f503b3
        Binary: Cache
        Binary remote: None
        Creation date: 2019-03-11 16:09:47
        Required by:
            conanfile.py (libB/1.0.0@None/None)
    conanfile.py (libB/1.0.0@None/None)
      ID: 8a4d75100b721bfde375a978c780bf3880a22bab
      BuildID: None
      Requires:
          libA/1.2.3@user/channel
    

    您可以看到为 libB 生成的二进制 ID 将是 8a4d75100b721bfde375a978c780bf3880a22bab。如果我们将要求更改为 libA/1.3.3@user/channel,我们将为 libA 获取相同的 ID。但是,如果我们将要求更改为 major 版本 libA/2.0.0@user/channel,这将反映为 libB 的 **新包 ID**,在本例中为 f1fc64edd1a6c2fb7d41b78ecf5972a0e7a85df8

    $ conan info .
    libA/2.0.0@user/channel
        ID: 5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9
        BuildID: None
        Remote: None
        Recipe: Cache
        Revision: 233bc35f1c94fcf2a2f18420d0d2bb45
        Binary: Cache
        Binary remote: None
        Creation date: 2019-03-11 16:19:42
        Required by:
            conanfile.py (libB/1.2.3@None/None)
    conanfile.py (libB/1.2.3@None/None)
        ID: f1fc64edd1a6c2fb7d41b78ecf5972a0e7a85df8
        BuildID: None
        Requires:
            libA/2.0.0@user/channel
    

这是在 Conan 1.13 之前唯一允许的默认行为,现在您可以在配置文件 conan.conf 中更改此默认行为。

[general]
default_package_id_mode = full_package_mode

遵循前面的示例,但将默认包 ID 模式设置为 full_package_mode,将表示对 libA 版本的任何更改都会生成新的 libB 二进制文件。

文档中 定义包 ABI 兼容性 部分中描述的任何模式都可以使用,并且设置此模式将对任何想要 **对包 ID 生成进行精细控制** 以及 **二进制文件与其依赖项的兼容性** 的人很有帮助。

可编辑包更新

在最新版本中,我们还引入了可编辑包,作为将项目的自定义布局映射到使用包的二进制文件而无需将其导出到缓存的一种方式。

在此版本中,我们通过有用的更改增强了此功能。

  • 布局文件现在允许使用 Jinja 模板 用于 **设置** 和 **选项**。

    [includedirs]
    src/core/include
    src/cmp_a/include
    
    [libdirs]
    {% if options.shared %}
    build/{{settings.build_type}}/shared
    {% else %}
    build/{{settings.build_type}}/static
    {% endif %}
    
  • 命令已重命名为 conan editable,并带有相应的子命令 conan editable addconan editable remove,用于将包置于此可编辑模式或将其删除。

  • 现在,您还可以显示所有配置为可编辑的包。

    $ conan editable list
    libB/1.2.3@user/channel
      Path: C:\Users\danimtb\test
      Layout: None
    

查看文档以获取有关 可编辑包 的更多信息。

工作区的新实现

工作区功能已回归,并基于可编辑功能进行了新的实现。此功能的用例是 **同时处理多个包**。对任何依赖项进行更改都需要发出 Conan 命令才能使更改在缓存中可用,以便下游包使用。

Conan 工作区允许在用户文件夹中拥有多个包,并且可以直接使用用户文件夹中的其他包,而无需将其放入本地缓存。此外,它还可以在包含多个包的大型项目上启用增量构建。

基本上,您定义一个包含项目布局的工作区 YAML 文件。

conanws.yml

editables:
    say/0.1@user/testing:
        path: say
    hello/0.1@user/testing:
        path: hello
    chat/0.1@user/testing:
        path: chat
layout: layout_gcc
workspace_generator: cmake
root: chat/0.1@user/testing

您可以指示一个通用的 可编辑布局文件 或为每个包设置一个特定的布局文件,以及您要构建的根使用者包。

最后,一个工作区生成器,它将成为工作区中所有包的包装器。类似于 Visual Studio 中包含在全局解决方案(工作区)中的项目(可编辑包)的概念。目前,唯一支持的生成器是 CMake,尽管 Visual Studio 生成器也是可行的。

我们为工作区引入了特定的命令和子命令 conan workspace install,它将使用上述工作区文件将库设置为可编辑模式,并生成工作区生成器文件 conanworkspace.cmake 以供使用。

$ conan workspace install ../cmake/conanws_gcc.yml

Requirements
    chat/0.1@user/testing from user folder - Editable
    hello/0.1@user/testing from user folder - Editable
    say/0.1@user/testing from user folder - Editable
Packages
    chat/0.1@user/testing:586bfc45a254754b47be1e6553aab648a85e425b - Editable
    hello/0.1@user/testing:98ce62312cb8b844c4a47cba2e495294a7e3e4ba - Editable
    say/0.1@user/testing:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Editable

say/0.1@user/testing: Generator cmake created conanbuildinfo.cmake
say/0.1@user/testing: Generated conaninfo.txt
say/0.1@user/testing: Generated graphinfo
say/0.1@user/testing: Generated conanbuildinfo.txt
hello/0.1@user/testing: Generator cmake created conanbuildinfo.cmake
hello/0.1@user/testing: Generated conaninfo.txt
hello/0.1@user/testing: Generated graphinfo
hello/0.1@user/testing: Generated conanbuildinfo.txt
chat/0.1@user/testing: Generator cmake created conanbuildinfo.cmake
chat/0.1@user/testing: Generated conaninfo.txt
chat/0.1@user/testing: Generated graphinfo
chat/0.1@user/testing: Generated conanbuildinfo.txt

查看 工作区文档 以了解有关更改包布局、拥有多个根或如何使用多配置 (Release/Debug) 包等更多信息。



如果您想了解有关此版本中更改的更多信息,请查看 更改日志 中的功能和修复的完整列表,其中包含实现和讨论详细信息的 Pull Request 链接,并不要忘记 更新

最后,如果您发现错误或想开始新的讨论,请随时在此处 打开新问题。非常感谢!