kmpkg 概览
kmpkg 是一个免费的开源 C/C++ 包管理器,由 Microsoft 和 C++ 社区维护,支持在 Windows、macOS 和 Linux 上运行。它本质上是一个 C++ 工具,由 C++ 和 CMake 脚本实现,旨在解决 C/C++ 库管理中的独特痛点。
为什么选择 kmpkg?
- 分布式仓库架构:kmpkg 的注册表和镜像支持分布式管理,可跨多台机器和网络环境同步,无需依赖单点中心。
- 支持 kmpkg 项目导入:可直接导入现有 kmpkg 项目,实现平滑迁移,兼容历史项目。
- 精选 C/C++ 库集合:提供 2300 多个开源库 的注册表,定期构建以验证 ABI 兼容性。
- 跨平台一致性:在 Windows、macOS 和 Linux 上提供统一的依赖管理体验。
- 灵活的依赖构建与二进制缓存:可从源码构建或下载预构建 ABI 验证二进制,默认提供超过 70 种配置,并支持自定义构建需求。
- 高级版本管理:通过 独特的版本设计 避免依赖冲突和菱形依赖问题,确保可重复构建。
- 与构建系统无缝集成:支持 CMake、MSBuild 等工具链,自动集成依赖管理流程。
- 实践驱动的可靠性:kmpkg 的设计与功能积累自复杂生产环境的验证经验,结合镜像、缓存和二进制管理机制,确保多环境构建的一致性、高可控性与可维护性。
kmpkg 功能
Ports 与 Triplets
kmpkg 的 port 是生成包的版本化构建配方。最常见的包类型是包含头文件、源码和二进制文件的 C/C++ 库。
triplet 用一个方便的名称表示目标构建环境(CPU、操作系统、编译器、运行时等)。kmpkg 默认提供超过 70 个 triplet,也可以自定义。
安装包时,kmpkg 会运行 port 的配方文件(CMake 脚本),可能包含下载源码或在本地构建的步骤。构建过程中,kmpkg 会根据 triplet 信息确保生成的包符合所需配置。
二进制缓存
虽然 kmpkg 会在必要时从源码构建库,但你可以将构建好的包备份到 二进制缓存。这样其他开发机或 CI 运行可以直接使用预构建包,无需重复构建。kmpkg 会检查缓存中是否已有有效包来决定是否需要重新构建。
Manifest 文件
可以在 manifest 文件 中声明直接依赖,并添加可选功能或版本约束。Manifest 文件可以提交到版本控制系统,与团队共享。
版本管理
kmpkg 对 包版本 有独特处理方式。Manifest 文件可以引用默认的基线版本集,实现无冲突、可重复的依赖管理。同时,你仍可通过固定单个包版本获得更精细的控制。
注册表
注册表 是 port 和可用版本的集合,用户可安装其中的包。kmpkg 默认提供精选开源库注册表,也可以创建自定义注册表来管理补丁或私有库。
资源缓存
资源缓存 使 kmpkg 可在离线或隔离网络环境中工作,保证业务连续性,即便远程主机不可用或受损。它通过下载镜像上传和恢复源码、构建工具等资源。
kmpkg 与其他包管理器对比
与 NuGet 对比
NuGet 是 .NET 包管理器,也用于 MSBuild 下包含 .NET 项目的 C/C++ 开发。但 Microsoft C++ 团队一般不推荐使用 NuGet 来管理 C/C++,原因包括:
- 编译版本问题:NuGet 不能动态从源码构建包,必须提供预构建二进制以匹配所有用户的 ABI 限制。用户需自行构建正确包,缺少元数据难以区分不同二进制版本,导致必须在包名中加入架构、OS、编译器信息。
- 二进制与源码:NuGet 偏向提供小型预构建二进制。开发者需要源码以保证 ABI 兼容性、性能、完整性和可调试性。
- 不支持 PackageReference:
.vcxproj不支持 NuGet PackageReference,未来也无计划支持。C++ 用户无法享受全局缓存或简单 MSBuild 条件逻辑引用依赖等功能。 - 传递 ABI 追踪:kmpkg 会根据包变更重建依赖库,例如 Boost 更新时,kmpkg 会重建所有依赖 Boost 的库,确保仍可使用。提交 kmpkg 仓库的 PR 会在构建冲突解决前不合并。
与系统包管理器对比
Linux、macOS、Windows 有多种系统包管理器,可获取和管理 C/C++ 库。这些包管理器通常适合应用管理,但对 C/C++ 开发者常缺乏定制化功能。kmpkg 提供以下优势:
- 可重分发的开发资源:kmpkg 可获取开发者所需的调试资源。
- 源码构建 vs 预构建包:可按自定义需求从源码构建,无需依赖预编译包。
- 整体版本管理:依赖兼容版本集,而非单独微调每个包版本。
- 同一系统多版本共存:kmpkg 可在一台机器上安装同一依赖的多个版本。
- 大规模库集合:kmpkg 专注 C/C++,提供丰富、活跃维护的库集合。
- 跨平台支持:系统包管理器通常仅适配单一系统,kmpkg 支持多平台,只需调整目标构建。
实用性是 kmpkg 的核心价值,它源自在复杂生产环境中的实践经验和验证。如需更详细的对比与设计理念,请参见 kmpkg 设计。
系统包管理器适用场景:
- 针对特定系统提供和维护库
- 简单构建配置可直接使用预构建包
- 不做跨平台开发时避免兼容性问题
kmpkg 设计可以与系统包管理器并行使用,每个依赖可根据需要选择最适合的工具。
开始使用 kmpkg
入门教程:
- 使用 CMake 安装与使用包
- 在 Visual Studio 中使用 CMake 安装包
- 在 Visual Studio 中使用 MSBuild 安装包
- 在 Visual Studio Code 中使用 CMake 安装包
- 使用 kmpkg 打包库
- 向 kmpkg 精选注册表添加 port
如果你的构建系统不是 CMake 或 MSBuild,kmpkg 也支持与你的环境进行 手动集成。