今年我们发布了 Conan 1.12,其中包含一些有趣的特性和改进,我们想重点介绍一下。让我们一起来看看吧!

可编辑包

在开发过程中,使用其他依赖项测试包中的新代码时,通常需要经历缓慢的 conan create 过程才能将新代码存储到缓存中。

遵循其他包管理器的路径,我们尝试设想 Conan 的“可编辑”模式应该如何工作,并且有一些主要要点

  • 用户必须能够在没有 Conan 的情况下进行编译(IDE/命令行,而不是 conan build)。

  • 自由选择头文件文件夹、源代码、库文件夹等任何项目结构。

  • 处理任何设置配置,而无需为所有设置创建人工包。

为了说明可编辑包的工作原理,我们创建了一个仓库 这里,我们将用它作为示例。

假设我们正在开发一个最终的“hello”应用程序,并且我们依赖于另一个名为“say”的库来打印我们的消息。我们正在开发“say”库,并希望检查“hello”应用程序中的更改。通常的方法是对“say”库进行更改,然后运行 conan create 将其二进制文件放入本地缓存。之后,使用 conan install 从“hello”应用程序中使用它。

使用此功能,我们有一个命令 conan link 来告诉 Conan 我们希望直接从当前文件夹(而不是从 Conan 缓存)中使用包名称为 say/0.1@user/testing 的“say”库。

$ cd cmake/say
$ mkdir build && cd build
$ conan link .. say/0.1@user/testing --layout=../layout

布局指示 Conan 必须在相对于命令中使用的 conanfile.py 文件目录的以下路径中搜索。以下是该文件的内容

[includedirs]
src

[libdirs]
build/lib

现在我们可以在开发文件夹中构建(这也可以由 IDE 触发)

$ conan install ..
$ cmake ../src -G "Visual Studio 15 2017 Win64"
$ cmake --build . --config Release

现在让我们从“hello”应用程序中使用“say”库

$ cd ../../hello
$ mkdir build && cd build
$ conan install ..
...
conanfile.py (hello/0.1@None/None): Installing package
Requirements
    say/0.1@user/testing from user folder - Editable
Packages
    say/0.1@user/testing:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Editable
...
$ cmake ../src -G "Visual Studio 15 2017 Win64"
$ cmake --build . --config Release
$ bin\app.exe
Release: Hello World Release!

现在我们对“say”库进行一些更改,而无需将其移动到缓存中。例如,我们将 Release: 消息更改为 ****** Release ******: 并构建它

$ cd ../../hello
$ cmake --build . --config Release

最后,我们的“hello”应用程序应该使用修改后的“say”进行构建

$ cmake --build . --config Release
$ bin\app.exe
******* Release *******: Hello World Release!

如您所见,在开发过程中使用这种新的工作流程非常方便,并且编译与 Conan 没有耦合,只需要 conan install

如果您想了解更多信息,这里有一个 文档部分链接,解释了此新功能以及使用不同布局文件的可能性。

还有一些待解决的问题,例如拥有一个合适的 布局模板系统 或在搜索时显示处于可编辑模式的包,但我们希望在下一个版本中修复这些问题。

工作区的新的路径

我们知道,实验性的 工作区功能 备受关注。但是,随着版本的发布和开发的继续,我们开始认为工作区的实现存在一些不足。

此外,包布局和可编辑模式的想法非常有趣,值得探索。因此,我们决定推迟解决工作区相关问题,直到可编辑包发布。

我们已经在可编辑模式功能的基础上重新设计和重新实现了工作区,初步印象良好。我们将尝试在后续版本中重新开始开发它们。

可组合配置文件

使用 Conan 1.12,现在可以使用 --profile 参数的命令多次使用它来实现配置文件组合。

$ conan install . --profile windows --profile 32bit

应用值的优先级是从右到左。在本例中,“32bits”配置文件配置将优先于“windows”配置文件配置。

# windows                  # 32bit              # result
[settings]                 [settings]           [settings]
os=Windows                 os=Windows           os=Windows
os_build=Windows           os_build=Windows     os_build=Windows
arch=x86_64                arch=x86             arch=x86
arch_build=x86_64          arch_build=x86       arch_build=x86
compiler=Visual Studio                          compiler=Visual Studio
compiler.version=14                             compiler.version=14
compiler.runtime=MD                             compiler.runtime=MD
build_type=Release                              build_type=Release

当您想要添加构建需要工具(如 CMake)时,这是一个非常有用的功能,这并非特定于配置。例如,拥有一个带有构建需要 cmake_installercmake 配置文件和一个带有“gcc”编译器和 mingw_installermingw 配置文件将使其非常易于应用和使用

$ conan install . --profile mingw --profile cmake

某些命令的完整引用和 JSON

您可能知道,某些命令在引用其他包的名称时存在一些问题。例如,conan install --build <name> 仅使用需求的名称,这在使用具有相同名称但来自不同用户的依赖项时可能存在问题。现在您可以这样做

$ conan install . --build liba/1.0@user/channel

随着此功能的推出,install 命令现在还包括消费者包的附加引用,这对于获取一些已定义的信息(如用户或通道)非常有用。

$ conan install . liba/1.0@user/channel

文档的 此部分 中提供了更多信息。

最后介绍一下新的命令,conan info 现在有一个通用的 --json 参数,不仅用于构建顺序,还用于依赖关系图信息。我们相信这对于使用 Conan 编排 CI 的人来说非常有用。查看 输出部分 以了解其外观。

支持的新架构

此版本中也引入了 新架构。这次我们为 Apple 和 PowerPC 添加了新的架构。

Apple 为 watchOS 引入了一个新的架构,称为 arm64_32。由于我们已经遵循了 armvX 模式,并且 amrv8 已经到位,因此我们决定将其称为 armv8_32。类似地,在 settings.yml 中将名为 arm64e 的新 iOS 架构引入为 armv8.3。您可以使用 tools.to_apple_arch() 管理此转换。

最后,有人要求支持 PowerPC 32 位架构,因此也新增了一个 ppc32 架构。

这些可以使用 apple 工具和 tools.get_gnu_triplet() 正确处理,并将被一些生成器(如 b2)考虑在内。

安装 Conan 1.12 并运行新的 conan install 时,请检查您的 settings.yml 是否已更新。如果您的 settings.yml 被修改,则会创建一个新的 settings.yml.new,以便您可以检查差异。

生成器:模板文件和变量命名约定

几个版本前,我们引入了一个新的 make 生成器,并且变量的命名存在一些问题,可能会误导用户(请参阅 conan-io/docs#955)。

由于 Conan cpp_info 模型包含一个令人困惑的 cppflags,因此我们最终决定将生成器中的 CONAN_CPPFLAGS 重命名为 CONAN_CXXFLAGS,并遵循此路径用于 premake,遵循 cmake 生成器中已有的约定。还有一个问题是创建 cpp_info.cxxflags 属性,弃用在 conanfile 的 package_info() 方法中使用的 cpp_info.cppflags,而不会造成破坏(conan-io/conan#4461)。

另一方面,一些用户请求能够导出某种类型的模板文件,以便在某些情况下更轻松地生成 conanbuildinfo 文件。现在,在自定义生成器中允许使用 exports 属性

class MyCustomGeneratorPackage(ConanFile):
    name = "custom"
    version = "0.1"
    exports = "mytemplate.txt"

您可以在此 操作方法 中查看完整的示例。

其他改进

此版本中还提供了新的工具和改进

  • tools.Git()tools.SVN() 有一个新的方法 get_tag(),用于检查已检出的标签名称。(请参阅 链接)。

  • MSBuild() 构建帮助程序现在有一个定义字典,可用于在构建期间将任何属性设置为项目。此外,即使在配置文件中未指定工具集,也会应用默认工具集。这不会破坏旧的行为,因为这已经是 PlatformToolset 标志中应用的默认值。(请参阅 链接)。

  • tools.environment_append() 现在可以使用 None 值取消设置变量。(请参阅 链接)。

  • 短路径功能现在以确定性方式生成它们,而不是在短路径目录中具有随机路径。

如果您想了解有关此版本中更改的更多信息,请查看 更改日志 中的功能和修复的完整列表(其中包含相关拉取请求的链接),并不要忘记 更新

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