在生产环境中使用 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 配方更新非常频繁。配方本身可能会更新以支持新平台、修复错误,或要求其依赖项使用更新版本。另一方面,每个 ConanCenter 用户可能在其需求中拥有不同的版本组合。这意味着,即使输入的需求列表相同,Conan 在不同时间点解析出的依赖图可能不同——解析到不同的配方修订版、版本或包。这类似于其他语言(pip/PyPi、npm、cargo 等)中包管理器的默认行为。在强调可重复性的生产环境中,因此不鼓励以无约束的方式直接依赖 Conan Center。
以下指南包含一系列建议,旨在确保可重复性、可靠性、合规性以及(如适用)启用定制的控制。总而言之,在使用 ConanCenter 的包时,强烈建议遵循以下方法
可重复性和可再现性¶
如前所述 - 给定一组需求,ConanCenter 中的更改可能导致 Conan 依赖解析器在不同时间解析出不同的依赖图。这不仅适用于库的实际版本(例如使用 opencv/4.5.0
而不是 opencv/4.2.1
)- 也适用于配方本身。也就是说,opencv/4.5.0
配方可能存在多个修订版,这可能对使用者产生副作用。配方的更改通常旨在解决问题(错误修复)、实现目标功能(例如添加条件选项、支持新平台)或更改依赖项的版本。
为了确保可重复性,强烈建议在使用者端使用锁文件:请查看锁文件文档了解更多信息。
锁文件确保 Conan 能够以可重复且一致的方式解析出相同的依赖图——从而确保在多个系统(CI、开发者等)中使用了相同的版本。
锁文件也在其他包管理器中被使用,例如 Python 的 pip、Rust 的 Cargo、npm 等——这些建议与其他技术的实践是一致的。
此外,强烈建议将您的配方和包托管在您自己的服务器中(见下文)。这两种方法都有助于您控制何时将 ConanCenter 的上游更改传播到您的团队和系统。
服务可靠性¶
从 ConanCenter 远程仓库消费配方和包可能会在停机期间(计划内或计划外)受到影响。虽然我们尽一切努力确保 ConanCenter 始终可用,并且计划外停机很少发生并得到紧急处理——但这会影响直接依赖 ConanCenter 的用户。此外,从源码构建配方时,需要从 ConanCenter 控制范围之外的远程服务器检索源码包(通常是 zip 或 tar 文件)。偶尔,这些服务器也可能遭遇计划外停机。
在需要高可用性的企业生产环境中,强烈建议将配方和二进制包托管在您控制的服务器中。
这也可以防止瞬时网络问题以及从外部源传输二进制数据引起的问题。这些建议也适用于在任何包管理器中消费来自外部源的包的情况。
合规性和安全性¶
一些行业,如金融、机器人和嵌入式系统,对变更管理、开源许可证和可重复性有更强的要求。例如,配方的更改可能导致依赖项解析到新版本,而该版本的许可证可能已更改,需要由您的组织进行验证和审计。在某些行业,如医疗或汽车,您可能需要确保所有依赖项都可以以可重复的方式从源码构建,因此使用 Conan Center 提供的二进制包可能不合适。在这些情况下,我们建议从源码构建您自己的二进制包
控制和定制¶
依赖项的使用者通常需要对外部库进行定制更改——通常是为了支持 ConanCenter 或原始库作者未考虑的特定平台配置、回溯移植错误修复等。其中一些更改可能不适合合并到 ConanCenter 中,而且可能需要经过 ConanCenter 维护者的审查和验证才能发生。因此,如果您需要严格控制配方的更改,强烈建议不仅托管 Conan 远程仓库,还要托管您自己的 conan-center-index 配方仓库分支。
以下小节将更详细地描述上述策略