介绍¶
Conan 是一个用于 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,可在所有平台(Windows、Linux、macOS、FreeBSD、Solaris 等)上运行,并可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还集成了所有构建系统,如 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等,包括专有系统。
它专门设计和优化,以加速 C 和 C++ 项目的开发和持续集成。通过全面的二进制管理,它可以使用完全相同的流程在所有平台上为任意数量的不同版本的包创建和重用任意数量的不同二进制文件(适用于不同的配置,如架构、编译器版本等)。由于它是去中心化的,您可以轻松运行自己的服务器来私下托管您的包和二进制文件,而无需共享它们。免费的JFrog Artifactory 社区版 (CE)是推荐的 Conan 服务器,用于在您控制下私密托管您的包。
Conan 成熟且稳定,坚定致力于前向兼容性(不破坏现有功能的策略),并拥有一支完整的团队全职致力于其改进和支持。它得到了一个庞大社区的支持和使用,包括ConanCenter的开源贡献者和包创建者,以及数千个使用它的团队和公司。
开源¶
Conan 是免费和开源的,采用宽松的 MIT 许可。可以在https://github.com/conan-io/conan查看源代码和问题跟踪(用于提问和支持、报告错误以及提出功能请求和改进建议)。
去中心化包管理器¶
Conan 是一个采用客户端-服务器架构的去中心化包管理器。这意味着客户端可以从不同的服务器(“远程”)获取包,也可以上传包到不同的服务器,类似于“git”从/向 git 远程仓库的推拉模型。
从高层次看,服务器仅存储包。它们不构建也不创建包。包由客户端创建,如果二进制文件是从源代码构建的,则该编译过程也由客户端应用程序完成。

上图中的不同应用程序是
Conan 客户端:这是一个控制台/终端命令行应用程序,包含包创建和使用的核心逻辑。Conan 客户端有一个用于包存储的本地缓存,因此它允许您完全离线创建和测试包。只要不需要从远程服务器获取新包,您也可以离线工作。
JFrog Artifactory 社区版 (CE) 是推荐的 Conan 服务器,用于在您控制下私密托管您的包。它是 JFrog Artifactory 的免费社区版,专为 Conan 包设计,包括 WebUI、多种身份验证协议 (LDAP)、用于创建高级拓扑的虚拟和远程仓库、Rest API 以及用于托管任何工件的通用仓库。
conan_server 是一个与 Conan 客户端一起分发的小型服务器。它是一个简单的开源实现,提供基本功能,但没有 WebUI 或其他高级功能。
ConanCenter 是一个中央公共仓库,社区在这里贡献用于流行开源库的包,例如 Boost、Zlib、OpenSSL、Poco 等。
二进制管理¶
Conan 最强大的功能之一是它能够为任何可能的平台和配置创建和管理预编译二进制文件。通过使用预编译二进制文件并避免重复从源代码构建,它为开发人员和持续集成服务器节省了大量时间,同时还提高了工件的可复现性和可追溯性。
包由“conanfile.py”定义。这是一个定义包的依赖项、源代码、如何从源代码构建二进制文件等的脚本文件。一个包的“conanfile.py”配方可以生成任意数量的二进制文件,每个不同的平台和配置(操作系统、架构、编译器、构建类型等)对应一个。这些二进制文件可以在所有平台上使用相同的命令创建并上传到服务器,从而为所有包提供单一事实来源,并且不需要为每个不同的操作系统提供不同的解决方案。

从服务器安装包也非常高效。仅下载当前平台和配置所需的二进制文件,而不是全部。如果兼容的二进制文件不可用,也可以在客户端从源代码构建包。
所有平台,所有构建系统和编译器¶
Conan 可在 Windows、Linux(Ubuntu、Debian、Red Hat、ArchLinux、Raspbian)、OSX、FreeBSD 和 SunOS 上运行,并且由于其可移植性,它可能在任何其他可以运行 Python 的平台上工作。它可以面向任何现有平台:从裸机到桌面、移动、嵌入式、服务器,以及交叉构建。
Conan 也适用于任何构建系统。它内置了集成功能,以支持最流行的构建系统,如 CMake、Visual Studio (MSBuild)、Autotools 和 Makefiles、Meson、SCons 等,但这并非强制要求使用其中任何一个。甚至不需要所有包都使用相同的构建系统:每个包可以使用自己的构建系统,并依赖于使用不同构建系统的其他包。它还可以与任何构建系统集成,包括专有系统。
同样,Conan 可以管理任何编译器和任何版本。它为最流行的编译器(gcc、cl.exe、clang、apple-clang、intel)提供了默认定义,并支持不同版本的配置、运行时、C++ 标准库等。此模型也支持扩展到任何自定义配置。
稳定性¶
从 Conan 2.0 及更高版本开始,我们致力于稳定性,目标是在工具和平台发展的同时不破坏用户空间。这意味着
向前升级到后续小版本 2.1、2.2、…、2.X 不应破坏现有的配方、包或命令行流程
如果出现破坏性变更,将被视为回归并予以回滚。
错误修复不被视为破坏性变更,依赖于此类错误不正确行为的配方和包将被视为已经损坏。
只有https://docs.conan.org.cn中记录的功能才被视为 Conan 公共接口的一部分。私有实现细节以及文档中未包含的所有内容都可能更改。
兼容性始终被视为前向的。新的 API、工具、方法、助手可以在后续的 2.X 版本中添加。使用这些功能创建的配方和包将与早期 Conan 版本向后不兼容。
每个小版本仅支持最新发布的补丁版本 (major.minor.patch) 且视为稳定。
此承诺不包括以下事项
公共仓库,如 ConanCenter,默认使用最新版本的 Conan 客户端,使用旧版本可能会导致无法使用用新版本客户端创建的包和配方。建议您使用自己的私有仓库来存储生产环境所需的包副本,或者作为次要替代方案,使用某种锁定机制以避免 ConanCenter 中更新并需要最新 Conan 版本的包可能造成的干扰。
配置和自动工具检测,例如默认配置文件 (
conan profile detect
) 的检测,随时都可能更改。鼓励用户在其自己的配置文件中定义其配置以实现可重复性。新版本的 Conan 可能会检测到不同的默认配置文件。作为插件或钩子的扩展点的内置默认实现也可能随每个版本更改。用户可以提供自己的实现以获得稳定性。
使用
conan new
命令生成包模板的输出可以随时更新以使用最新功能。输出流 stdout、stderr,即终端输出,可能随时更改。请勿解析终端输出进行自动化操作。
文档中或 Conan 命令行界面输出中明确标记为
experimental
或preview
的任何内容。有关这些标签的详细定义,请阅读下面的部分。文档中标记为
deprecated
的任何功能不应再被使用,因为它将不再获得新的修复,并将在下一个主要版本中移除。Conan 客户端之外的其他工具和仓库
Conan 需要 Python >= 3.6 才能运行。Conan 将在 Python 版本被宣布生命周期结束 (EOL) 一年后弃用对其的支持。
如果您对 Conan 更新、稳定性或此稳定性定义的任何澄清有任何疑问,请在文档问题跟踪器中报告:https://github.com/conan-io/docs。
社区¶
Conan 正在被 TomTom、Audi、RTI、Continental、Plex、Electrolux 和 Mercedes-Benz 等数千家公司以及全球数万名开发人员用于生产。但 Conan 的一个重要组成部分是,其中许多用户会回馈社区,从而创建一个令人惊叹且乐于助人的社区
https://github.com/conan-io/conan 项目在 Github 上拥有约 8.6K 颗星,并获得了 400 多位不同用户的贡献(这仅指客户端工具)。
许多其他用户通过 https://github.com/conan-io/conan-center-index 仓库为 ConanCenter 贡献配方,为流行的开源库创建包,每年贡献数千个拉取请求。
两千多名 Conan 用户聚集在 CppLang Slack #conan 频道,帮助回答问题、讨论问题和方法,使其成为整个 CppLang Slack 中最活跃的频道之一。
#include<cpp> Discord 中有一个 Conan 频道。