Conan 1.31.0 在我们新的工具链策略方面又迈出了几步,同时还包含了大量提高用户体验的功能和修复。

上传性能改进

此版本包含一个期待已久的更改,它代表了一个优化,其影响力如此之大,以至于对于某些用例而言,它实际上等同于修复了一个错误。更改后的结果是,Conan 客户端现在会在提取内容完成后保留 conan_export.tgzconan_source.tgzconan_package.tgz 文件在本地缓存中。以前,这些文件在提取后会被删除。

这如何算是一种优化?好吧,系好安全带,因为这是一个漫长而曲折的故事。事实证明,许多工作流程(包括持续集成)在最后一步执行命令 conan upload * 非常常见。在以前的版本中使用此命令时,每个软件包都会经历对其所有 exportssources 以及所有 package 目录文件进行压缩的过程,然后再上传。这个压缩时间实际上累积起来,成为整个作业时间的重要百分比。这个问题被以下认识所放大:Conan 可以轻松验证没有任何内容发生更改,因此压缩和上传步骤都是完全不必要的,一旦你理解了正在发生的事情,就更难以接受它们。

但等等,情况甚至比这更糟糕!许多人可能已经知道,Conan 客户端在上传文件之前会先将这些 .tgz 文件的校验和与服务器进行比较。如果校验和匹配,则跳过上传。但是,事实证明,所有操作系统上的 .tgz 压缩结果并不相等。相同文件的压缩可能(而且经常会)导致在不同操作系统上生成校验和不同的 .tgz 文件!因此,对于 conan_source.tgzconan_exports.tgz,在多个操作系统上并行构建的组织将遇到不幸的情况,即来自不同操作系统的 conan upload 命令将开始上传这些文件,然后发现远程服务器上已经存在这些文件,但校验和与它想要上传的不同,从而导致失败。最终结果是,在这种情况下几乎每个人都将其 CI 服务的上传脚本中添加了 --force 以绕过错误。但这又带来了另一个负面影响。由于校验和不匹配,构建服务器会反复轮流重新上传“相同”的 .tgz 文件。这也意味着,如果您有两个操作系统上传到远程服务器,那么哪个操作系统上传作业完成后保留在远程服务器上的“最后一个”.tgz 文件是随机的。因此,下次任何用户或具有其他操作系统(s) 的 CI 作业安装软件包时,重新压缩步骤之前的重新上传操作总是会导致新的校验和。因此,许多工作流程最终使用了 --force,而实际上并不需要。

好消息是,这个问题现在在未来很大程度上得到了解决。现在 Conan 会将 .tgz 文件保留在缓存中,如前所述,重新压缩和重新上传将有效跳过。此外,虽然 Conan 团队无法解决不同操作系统将创建校验和不同的 .tgz 文件这一根本问题,但有一个解决方法可以解决剩余的问题。也就是说,并行构建服务器在不同操作系统上轮流重新上传并覆盖服务器上的 .tgz 文件的问题。现在,可以重新配置这些 CI 作业,以从执行 conan exportconan upload 的单个“阶段”开始,在远程服务器上放置一对 conan_export.tgzconan_source.tgz。然后,可以将此阶段后跟任何数量的并行构建阶段,这些阶段使用 --build 标志(或等效标志)执行 conan install。然后,这些阶段将下载并共享这些 .tgz 文件。然后,至关重要的是,当它们都到达 conan upload 命令时,它们将拥有相同的 .tgz 文件,因此所有冗余上传都将被跳过。

新的 iOS 和 Android 工具链

注意:这些功能被认为是“草稿”或“alpha”级别的概念验证。我们预计需要额外的反馈和更改才能使它们正常工作。

就像我们过去几个版本一样,此版本继续推进我们的工具链计划。这次,我们对 iOS 和 Android 都进行了两个重要的概念验证添加。对于这两个工具链,我们都基于 CMake 的使用进行了概念验证,但计划在未来获得这些初步实现的一些反馈后,探索其他替代方案。针对这些移动平台进行交叉构建是 Conan 的主要用例之一,因此我们认为此步骤在工具链抽象的成熟方面非常重要。

新的 MsBuildCmd 助手

注意:此功能摘要引用了一个旧的助手和一个新的助手。为了在解释中将它们区分开来,旧的助手将被称为 MsBuild,新的将被称为 MsBuildCmd。但是,在当前的实现中,新的 MsBuildCmd 助手实际上已被赋予了 MsBuild 的别名,以便与旧的助手匹配。

在之前的版本中,我们包含了新的 MsBuildToolchain 的概念验证。这是我们重构与 MsBuild 交互方式的一部分。此版本包含该工作的一部分,即新的 MsBuildCmd 助手,旨在与 MsBuildToolchain 一起工作。 MsBuildCmd 助手的前身是 MsBuild 助手。在我们解释与 MsBuildCmd 的区别之前,让我们简要讨论一下。

最初的 MsBuild 助手专注于以单个 Python 类和许多成员函数的形式提供最大便利和最少仪式。它处理三个不同的职责

  1. 处理查找和执行 Microsoft 工具的复杂任务,包括 vcvarsvsdevcmd 脚本、vswhere.exemsbuild.exe,以及选择传递给 Conan 的 compiler.version 设置中的适当版本。

  2. 确保以下主要 settings 通过命令行参数传递给 Conan

    • /p:Configuration(从 Conan 中的 build_type 映射)
    • /p:Platform(从 Conan 中的 arch 设置映射)
  3. 确保以下次要 settings 通过 .props 文件传递给 Conan

    • Visual Studio 运行时(从 Conan 中的 compiler.runtime 映射)
    • Visual Studio 平台工具集(从 Conan 中的 compiler.toolset 映射)
    • C++ 标准(从 Conan 中的 cppstd 设置映射)

虽然略微简化了,但从这个角度来看 MsBuild 助手,很容易解释新的 MsBuildCmd 助手是如何不同的,以及 MsBuildToolchain 如何融入等式。简单地说,MsBuildCmd 完全专注于上面的第 1 和第 2 点。 MsBuildToolchain 完全专注于上面的第 3 点。

注意:此版本已从工具链中删除配置项“Visual Studio 平台工具集”,并且 Conan 将不再设置它。

这种职责分离可能看起来并不那么重要,但在内部,它使我们能够解决和修复过去三年中提出的各种实际错误以及严重的用户体验问题。

按配置文件筛选搜索结果

打包人员和用户经常遇到的最常见的错误之一是以下错误

ERROR: Missing prebuilt package for 'package/version@user/channel'
Try to build it from sources with "--build package"
Or read "https://docs.conan.org.cn/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package"

从技术上讲,此错误的含义与字面意思完全相同。请求了一个预构建的二进制文件,但未在本地缓存或任何已配置的远程服务器中找到。但是,从用户体验的角度来看,此错误通常表示以下两种情况之一,这通常表示以下两种后续步骤之一

  1. 用户正在构建一个独特的配置,他们知道找不到二进制文件。在这种情况下,他们忘记包含必要的 --build 标记,并且错误消息中的建议是相关的、正确的,并且非常有帮助。

  2. 用户正在构建一个常见的配置,他们期望找到二进制文件。在这种情况下,通常意味着他们期望这些二进制文件由持续集成 (CI) 服务构建并上传到远程存储库。在这里,错误消息中的建议可以让他们解决问题,但也表明 CI 服务中存在其他问题或先前的故障。问题可能是 CI 作业失败。然而,更常见的问题是 CI 作业使用不正确或不完整的构建配置列表(Conan profiles)构建了软件包。

用户创建了许多 GitHub 问题和 Slack 对话,主要围绕改进第二种情况的用户体验。它需要改进的原因是,当遇到这个非常常见的错误时,用户可用的解决步骤既耗时又令人不快。用户必须进行大量的推理、调查和手动试错,才能准确地确定问题所在。用户必须考虑的问题列表包括

  1. CI 服务器是否构建了不正确或不完整的配置文件列表?
  2. 它是否构建了所有正确的配置文件但部分失败?
  3. 我的本地配置文件是否不正确或已过时?
  4. 如果构建了一些配置文件,我的配置文件与它们之间有什么区别?

最后一个问题通常是用户应该(并且确实)首先提出的问题。这是因为在大多数情况下,最安全的假设是使用的本地配置文件存在某些差异或错误(否则其他用户可能会受到影响,报告问题并解决它)。因此,在诊断此错误的现有过程中,最常见的任务之一是使用 --query 参数对 conan search 命令进行重复调用,更改选项和设置,直到用户能够回答上面列出的最后一个问题。此版本提供了一种执行此任务的替代方法。

为了使用新功能,用户手动搜索产生错误的软件包的可用二进制文件,但这次不使用 --query。这类似于旧流程,但现在用户添加 --html 标记以生成 HTML 输出。然后,用户可以在 Web 浏览器中打开生成的 HTML 输出。最后,用户可以通过将失败的 conan installconan create 日志中的“有效配置文件”复制并粘贴到搜索结果网页上的新对话框中,来利用新功能。首先,这将显示空结果,因为我们正在粘贴我们已经知道不存在的二进制文件的配置文件。但是,现在用户可以通过在对话框中添加和删除配置文件行并分析 HTML GUI 来执行他们的试错,而不是重复调用 conan search 命令并在终端中查看结果。我们希望许多用户会更喜欢这种工作流程。

这是搜索结果页面中新输入框的屏幕截图。

Filter by profile

其他值得注意的功能

此版本还包含其他几个重要功能

  • conanfile 已作为参数添加到 pre_download_packagepost_download_package 钩子中。

  • conan info 命令学会了如何输出一些新字段。这包括来自 conanfile.py 的相对较新的 providesdeprecated 属性。它还学会了如何在启用修订版本功能时呈现软件包修订版本。

  • 已添加 CONAN_LOGIN_ENCRYPTION_KEY 以提供一种模糊机制,旨在用于持续集成服务器日志。在多个地方(包括此博客),我们强调这并不构成安全的加密机制,而是用于文档中解释的非常狭窄和特定的目的。

  • conan config install 现在可以安装单个文件。



除了上面列出的项目外,还有一长串相当有影响的错误修复,您可能希望了解。如果是这样,请参阅 更改日志 以获取完整列表。

我们希望您喜欢此版本,并期待您提供 反馈