在生产环境中使用 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 配方的多个修订版,这可能会对使用者产生副作用。配方的更改通常解决一个问题(错误修复)、目标功能(例如添加条件选项、支持新平台)或更改依赖项的版本。
为了确保可重复性,强烈建议在消费者端使用 lockfiles:请查看 lockfile 文档 以获取更多信息。
Lockfiles 确保 Conan 将以可重复和一致的方式解析相同的图形 - 从而确保在多个系统(CI、开发人员等)中使用相同的版本。
Lockfiles 也用于其他包管理器,如 Python pip、Rust Cargo、npm - 这些建议与这些其他技术的实践一致。
此外,强烈建议将您的配方和包托管在您自己的服务器上(如下所示)。这两种方法都有助于您控制何时将 ConanCenter 的上游更改传播到您的团队和系统。
服务可靠性¶
从 ConanCenter 远程使用配方和包可能会受到停机时间(计划内或计划外)的影响。虽然尽一切努力确保 ConanCenter 始终可用,并且计划外的停机时间很少且受到紧急处理 - 但这可能会影响直接依赖 ConanCenter 的用户。此外,从源代码构建配方时,需要从 ConanCenter 无法控制的远程服务器检索源代码包(通常是 zip 或 tar 文件)。偶尔,这些也可能遭受计划外的停机时间。
在需要强正常运行时间的企业生产环境中,强烈建议将配方和二进制包托管在您控制的服务器上。
这也可以防止瞬态网络问题以及从外部来源传输二进制数据引起的问题。这些建议也适用于在使用任何包管理器从外部来源消耗包时。
合规性和安全性¶
一些行业,如金融、机器人和嵌入式,对变更管理、开源许可和可重复性有更严格的要求。例如,配方的更改可能会导致依赖项解析为新版本,而该版本的许可已更改,需要您的组织进行验证和审核。在医疗或汽车等行业,您可能需要确保所有依赖项都可以以可重复的方式从源代码构建,因此使用 Conan Center 提供的二进制文件可能不可取。在这种情况下,我们建议您从源代码构建自己的二进制包
如果直接使用 conancenter 远程仓库,您的组织可能需要构建二进制文件,而不是直接从 ConanCenter 下载。可以使用 recipes_only 字段 在远程配置中 实现这一点,但您也可能希望从源代码构建包,而不要依赖 ConanCenter 提供的配方和二进制文件。有关更多信息,请参阅上面的链接。
控制和定制¶
依赖项的用户通常需要对外部库进行自定义更改 - 通常是为了支持 ConanCenter 或原始库作者未考虑的特定平台配置、移植错误修复等。其中一些更改可能不适合合并到 ConanCenter 中,并且在经过 ConanCenter 维护人员的审查和验证后才会发生。因此,如果您需要对配方中的更改进行严格控制,强烈建议您不仅托管一个 Conan 远程仓库,还托管您自己的 conan-center-index 配方仓库的 fork。
以下子部分更详细地描述了上述策略