在生产环境中使用 ConanCenter 软件包¶
注意
Conan 2.9.2 中的默认远程更新
从 Conan 2.9.2 版本开始,默认远程已更改为 https://center2.conan.io。之前的默认远程 https://center.conan.io 现在已被冻结,将不再接收更新。建议更新您的远程配置以使用新的默认远程,以确保访问最新的 recipe 和软件包更新(有关更多信息,请阅读此帖子)。
如果您仍然将已弃用的远程配置为默认远程,请使用以下命令更新
conan remote update conancenter --url="https://center2.conan.io"
ConanCenter 是一个非常棒的资源,其中包含超过 1500 个由社区贡献的库和应用程序的 recipe 参考实现。因此,它是关于如何为开源依赖项创建和构建 Conan 软件包的绝佳知识库。
ConanCenter 还为各种配置构建和提供二进制软件包:多种操作系统(Windows、Linux、macOS)、编译器、编译器版本和库变体(共享、静态)。最重要的是,对于许多库,社区贡献者确保 recipe 与其他操作系统(Android、iOS、FreeBSD、QNX)和 CPU 架构兼容。Conan Center 中的 recipe 是 Conan 通用性承诺的最佳例证。
与其他软件包管理器或仓库不同,ConanCenter 不维护版本的固定快照。相反,对于给定的库(例如 OpenCV),多个版本同时处于积极维护状态。这使用户可以更好地控制要使用的版本,而不是必须固定在较旧的版本,或者被迫始终使用最新版本。
为了支持这个生态系统,ConanCenter recipe 更新非常频繁。Recipe 本身可能会更新以支持新平台、错误修复或需要更新版本的依赖项。另一方面,ConanCenter 的每个用户可能在其需求中具有不同的版本组合。这意味着给定相同的输入需求列表,Conan 可能会在不同的时间点以不同的方式解析依赖关系图 - 解析为不同的 recipe 修订版本、版本或软件包。这类似于其他语言(pip/PyPi、npm、cargo 等)中软件包管理器的默认行为。在可重现性很重要的生产环境中,因此不鼓励以不受约束的方式直接依赖 Conan Center。
以下指南包含一系列建议,以确保可重复性、可靠性、合规性以及在适用的情况下,控制以实现自定义。总而言之,强烈建议在使用 ConanCenter 的软件包时遵循以下方法
使用 lockfiles 锁定您依赖的版本和修订版本
托管您自己 ConanCenter recipe 和软件包二进制文件的副本 在您控制下的服务器中
可重复性和可再现性¶
如前所述 - 给定一组需求,ConanCenter 的更改可能会导致 Conan 依赖关系求解器随着时间的推移解析不同的依赖关系图。这不仅适用于库的实际版本(例如 opencv/4.5.0
而不是 opencv/4.2.1
)- 也适用于 recipe 本身。也就是说,可能存在 opencv/4.5.0
recipe 的多个修订版本,这可能会对使用者产生副作用。Recipe 中的更改通常解决问题(错误修复)、目标功能(例如,添加条件选项、对新平台的支持)或更改依赖项的版本。
为了确保可重复性,强烈鼓励在消费者端使用 lockfiles:请查看 lockfile 文档 以获取更多信息。
Lockfiles 确保 Conan 将以可重复和一致的方式解析相同的依赖关系图 - 从而确保在多个系统(CI、开发人员等)中使用相同的版本。
Lockfiles 也用于其他软件包管理器,如 Python pip、Rust Cargo、npm - 这些建议与其他技术的实践一致。
此外,强烈建议在您自己的服务器中托管您的 recipe 和软件包(见下文)。这两种方法都有助于您控制何时将来自 ConanCenter 的上游更改传播到您的团队和系统。
服务可靠性¶
在停机期间(计划内或其他情况),从 ConanCenter 远程消费 recipe 和软件包可能会受到影响。虽然已尽一切努力确保 ConanCenter 始终可用,并且计划外停机很少发生且会紧急处理 - 但这可能会影响直接依赖 ConanCenter 的用户。此外,当从源代码构建 recipe 时,这需要从 ConanCenter 控制之外的远程服务器检索源软件包(通常是 zip 或 tar 文件)。偶尔,这些服务器也可能遭受计划外停机。
在需要高正常运行时间的企业生产环境中,强烈建议在您控制下的服务器中托管 recipe 和二进制软件包。
这还可以防止瞬态网络问题,以及由从外部源传输二进制数据引起的问题。这些建议也适用于在使用任何软件包管理器时从外部源消费软件包。
合规性和安全性¶
一些行业,如金融、机器人和嵌入式,对变更管理、开源许可证和可重现性有更严格的要求。例如,recipe 中的更改可能会导致为依赖项解析新版本,从而导致该版本的许可证已更改,并且需要您的组织进行验证和审核。在某些行业(如医疗或汽车)中,您可能需要确保所有依赖项都可以通过可重复的方式从源代码构建,因此使用 Conan Center 提供的二进制文件可能并不可取。在这些情况下,我们建议从源代码构建您自己的二进制软件包
控制和自定义¶
对于依赖项的用户来说,通常需要对外部库进行自定义更改 - 通常是为了支持 ConanCenter 或原始库作者未考虑的特定平台配置、反向移植错误修复等。其中一些更改可能不适合合并到 ConanCenter 中,并且可能要等到 ConanCenter 维护人员审查和验证后才会发生。因此,如果您需要严格控制 recipe 中的更改,强烈建议不仅托管 Conan 远程仓库,还托管您自己的 conan-center-index recipe 仓库分支。
以下小节更详细地描述了上述策略