在生产环境中使用 ConanCenter 包

注意

Conan 2.9.2 中的默认远程更新

Conan 版本 2.9.2 开始,默认远程已更改为 https://center2.conan.io。之前的默认远程 https://center.conan.io 现在已冻结,不再接收更新。建议更新您的远程配置以使用新的默认远程,以确保访问最新的配方和包更新(有关更多信息,请阅读这篇文章)。

如果您仍将已弃用的远程仓库配置为默认,请使用以下命令进行更新

conan remote update conancenter --url="https://center2.conan.io"

ConanCenter 是一个了不起的资源,它包含了社区贡献的超过 1500 个库和应用程序的配方参考实现。因此,它是在如何为开源依赖项创建和构建 Conan 包方面的一个重要知识库。

ConanCenter 还构建并提供了适用于多种配置的二进制包:多种操作系统(Windows、Linux、macOS)、编译器、编译器版本和库变体(共享、静态)。此外,对于许多库,社区贡献者确保配方兼容额外的操作系统(Android、iOS、FreeBSD、QNX)和 CPU 架构。Conan Center 中的配方是 Conan 通用性承诺的最佳范例。

与其他包管理器或存储库不同,ConanCenter 不维护固定版本的快照。相反,对于给定的库(例如 OpenCV),会同时积极维护多个版本。这使用户能够更好地控制要使用的版本,而不是被迫固定使用旧版本,或被推着始终使用最新版本。

为了支持这个生态系统,ConanCenter 配方更新非常频繁。配方本身可能会更新以支持新平台、修复 bug 或需要更新版本的依赖项。另一方面,ConanCenter 的每个用户在其需求中可能有不同的版本组合。这意味着,给定相同的需求列表,Conan 在不同时间点可能会以不同的方式解析图——解析到不同的配方修订版、版本或包。这与其他语言中的包管理器(pip/PyPi、npm、cargo 等)的默认行为类似。因此,在可重现性很重要的生产环境中,不鼓励直接以不受限制的方式依赖 Conan Center。

以下指南包含一系列建议,以确保可重现性、可靠性、合规性以及在适用的情况下进行定制的控制。总而言之,在使用 ConanCenter 的包时,强烈建议遵循这些方法:

可重现性和一致性

如前所述——给定一组需求,ConanCenter 的更改可能导致 Conan 依赖关系解析器随时间解析出不同的图。这不仅适用于库的实际版本(例如,opencv/4.5.0 而不是 opencv/4.2.1),也适用于配方本身。也就是说,opencv/4.5.0 配方可能存在多个修订版,这可能对消费者产生副作用。配方的更改通常会解决一个问题(bug 修复)、针对功能(例如,添加条件选项、支持新平台)或更改依赖项的版本。

为了确保可重现性,强烈鼓励在消费者端使用锁定文件:请参阅 锁定文件文档 以获取更多信息。

锁定文件可确保 Conan 以可重现和一致的方式解析相同的图——从而确保在多个系统(CI、开发人员等)中使用相同的版本。

锁定文件也用于其他包管理器,如 Python pip、Rust Cargo、npm——这些建议与其他技术实践一致。

此外,强烈建议在您自己的服务器上托管您的配方和包(见下文)。这两种方法都有助于您控制上游来自 ConanCenter 的更改何时在您的团队和系统之间传播。

服务可靠性

在停机期间(计划内或计划外),从 ConanCenter 远程消耗配方和包可能会受到影响。尽管已尽一切努力确保 ConanCenter 始终可用,并且计划外停机很少见且会紧急处理——但这会影响直接依赖 ConanCenter 的用户。此外,在从源文件构建配方时,这需要从 ConanCenter 外部的远程服务器检索源包(通常是 zip 或 tar 文件)。偶尔,这些也可能遭受计划外停机。

在对正常运行时间有严格要求的企业生产环境中,强烈建议在您控制的服务器上托管配方和二进制包。

这还可以防止瞬态网络问题,以及由外部源传输二进制数据引起的问题。在任何包管理器中消耗外部源的包时,这些建议也适用。

合规性和安全性

某些行业,如金融、机器人和嵌入式,对变更管理、开源许可证和可重现性有更严格的要求。例如,配方的更改可能导致解析出依赖项的新版本,从而导致该版本的许可证发生更改,需要您的组织进行验证和审计。在医疗或汽车等某些行业,您可能需要确保所有依赖项都可以从源文件以可重现的方式构建,因此直接使用 Conan Center 提供的二进制文件可能不合适。在这些情况下,我们建议从源文件构建您自己的二进制包。

如果直接使用 conancenter 远程,您的组织可能要求二进制文件从源文件构建,而不是直接从 ConanCenter 下载。这可以通过 远程配置中的 recipes_only 字段来例外实现,但您很可能还希望从源文件构建包,而不是依赖 ConanCenter 提供的配方和二进制文件。有关更多信息,请参阅上面的链接。

控制和定制

依赖项的用户通常需要对外部库进行自定义更改——通常是为了支持 ConanCenter 或原始库作者未考虑到的特定平台配置、回溯 bug 修复等。其中一些更改可能不适合合并到 ConanCenter,并且可能要到 ConanCenter 维护者审查和验证后才能进行。出于这个原因,如果您需要对配方中的更改进行严格控制,强烈建议不仅托管一个 Conan 远程,还要托管您自己的 conan-center-index 配方存储库的 fork。

以下子章节将更详细地描述上述策略