写代码离不开别人的开源库。早期引入第三方依赖全靠手动下载压缩包解压,一旦库版本更新或者出现多层依赖冲突,直接陷入依赖地狱。包管理器就是替我们自动下载、更新并梳理依赖关系的工具。
今天梳理一下各大主流语言和系统工具的核心区别与常用命令。
前端与 JS 生态
npm
Node.js 官方自带的默认包管理器,也是最大的包仓库,收录超过 200 万个包。初学前端最先接触的一定是它。
- 优点:生态最全,开箱即用,所有教程默认通用。
- 缺点:每个项目都要完整复制一份依赖,node_modules 文件夹体积大;扁平化安装容易出现幽灵依赖;早期安装速度较慢。
1 | # 初始化项目 |
Yarn
Facebook 为了解决 npm 当时速度慢、版本不稳定的问题推出的工具。
- 特点:率先引入了 yarn.lock 锁定文件,保证不同机器安装出来的依赖完全一致;支持离线缓存,下载过的包不用重复下载。
- 注意:同一个项目切忌混用 npm 和 yarn,混用会导致锁文件冲突和依赖混乱。
1 | # 添加依赖 |
pnpm
名字里的 p 代表高性能,主打节省磁盘空间和规范依赖树。
- 特点:全电脑只存一份包实体,通过硬链接和软链接组织每个项目的 node_modules。安装一次 React,其他项目直接复用,非常省空间。
- 适用:特别适合多项目管理和 Monorepo 大仓。
1 | # 全局安装 pnpm |
Bun
不仅是包管理器,还是一个全新的运行时,用来替代 Node.js。
- 特点:使用 Zig 编写,底层 I/O 做了极致优化,安装速度比 npm 快 10 到 20 倍;自带打包器、测试运行器,原生支持 TypeScript。
- 适用:追求极致速度的新项目或探索型工具。
1 | # 安装依赖 |
Python系列
pip
Python 官方标准包管理器,配合 PyPI 仓库使用。
- 核心问题:默认是全局安装,项目一多极易发生版本冲突。
- 规则:必须配合虚拟环境使用,用 venv 隔离每个项目的依赖。
1 | # 创建并激活虚拟环境 |
Conda
数据科学和机器学习领域的标配包与环境管理器。
- 特点:不仅管 Python 包,还能管理底层 C/C++ 库和 CUDA 驱动等预编译二进制文件。安装 NumPy、Pandas、TensorFlow 这类带复杂底层编译的库时,比 pip 省心很多。
1 | # 创建指定 Python 版本的独立环境 |
uv
由 Astral 团队用 Rust 开发的新一代极速工具,正在快速席卷 Python 生态。
- 特点:速度比传统 pip 快 10 到 100 倍,不仅完全兼容 pip 语法,还把 Python 解释器下载、虚拟环境创建和项目依赖锁定全包揽了。日常开发强烈建议优先尝试。
1 | # 兼容替代 pip 极速安装 |
C与C++
C/C++ 的包管理是所有主流语言里公认最折腾的。因为没有官方统一标准,而且编译受编译器类型、编译参数、架构和二进制兼容(ABI)的严苛限制,导致直到今天都没有一个大一统的工具。
目前生态里主要分成三派:
- 野生流派:许多老项目完全不用包管理器,直接手动把第三方库源码拷进项目,或者用 Git Submodule / CMake FetchContent 在编译时现场拉源码。
- vcpkg 派:微软主导的源码驱动方案,是目前个人开发者和开源社区最流行的选择。
- Conan 派:主打预编译二进制包,配置门槛较高,主要在企业级 CI/CD 和大型跨平台工程中使用。
vcpkg
微软开源的跨平台包管理器,对 Windows、Visual Studio 和 CMake 体系支持最成熟。
- 特点:本质上是一个庞大的编译脚本库。你让它装某个库,它会自动下载源码并在本地根据你的环境现编出静态或动态库,然后通过 CMake 工具链文件直接喂给你的项目。
1 | # 安装开源库 |
Conan
JFrog 旗下的开源 C/C++ 二进制包管理器。
- 特点:基于 Python 编写。与 vcpkg 默认在本地现场编译不同,Conan 强调直接下载打好的二进制包,避免了大型项目在本地漫长的编译等待,适合企业级私有依赖分发和持续集成。
1 | # 生成依赖并安装预编译包 |
Rust和Go
Cargo
Rust 官方标配的工程管理工具,体验公认极其丝滑。
- 特点:把创建项目、代码编译、跑测试、生成文档和依赖管理全包了。依托 crates.io 仓库,开箱即用,无需额外折腾配置。
1 | # 创建新项目 |
Go Modules
Go 从 1.11 引入、1.13 成为标准的依赖方案。
- 特点:没有中心化注册网站,依赖路径直接就是代码仓库地址;使用最小版本选择机制,写代码直接 import,执行命令自动分析下载,省心且不碍事。
1 | # 初始化模块 |
Java和PHP
Maven
Java 企业级开发的长青树,2004 年至今依旧广泛使用。
- 特点:采用 pom.xml 配置,强制标准项目目录规范。生态极其成熟,但在大型项目上 XML 冗长,全量编译偏慢。
1 | # 常用构建命令 |
Gradle
Java、Kotlin 和 Android 的现代构建工具。
- 特点:使用 Groovy 或 Kotlin DSL 代替 XML,支持增量构建与构建缓存,构建速度显著快于 Maven,是 Android 官方钦定的构建工具。
1 | # 使用项目 Wrapper 构建与运行 |
Composer
PHP 现代化的核心支柱。
- 特点:彻底改变了过去手动 include 文件的混乱局面,核心是 PSR-4 自动加载规范。现代 Laravel、Symfony 开发必备。
1 | # 引入新依赖并安装 |
系统工具
Homebrew
macOS 和 Linux 上最常用的系统包管理器,装机必备。
- 特点:Formula 管理命令行工具和数据库,Cask 管理带界面的桌面应用。软件安装在独立目录并通过软链接映射,不污染操作系统本身。
1 | # 安装命令行工具与数据库 |
Linux 系统工具
除了面向开发语言和跨平台的工具外,Linux 各发行版都有自己的系统级包管理器,用于安装底层服务和运行环境。
apt
Debian 和 Ubuntu 系列的标配包管理器。
- 特点:底层使用 dpkg 管理 .deb 二进制安装包,上层通过 apt 自动从软件源解析并下载所有关联依赖。日常运维使用最广泛。
1 | # 更新本地软件源索引 |
dnf
Red Hat、CentOS Stream 和 Fedora 系列的现代包管理器。
- 特点:底层使用 rpm 管理 .rpm 安装包。早期系统默认使用 yum,后来为了提升依赖解析速度和降低内存消耗,推出了基于 C 语言重构的 dnf。如今在现代 CentOS/RHEL 系统中,敲 yum 本质上也是软链接到 dnf。
1 | # 安装软件 |
pacman
Arch Linux 及其衍生发行版的专属包管理器。
- 特点:专为滚动更新系统设计,采用简单的压缩包格式,依赖解析和安装速度极快。配合 Arch 社区的用户软件仓库 AUR,几乎能装上任何开源软件。
1 | # 同步软件源并升级整个系统 |
apk
Alpine Linux 的轻量级包管理器。
- 特点:体积极小,执行速度飞快。因为 Alpine 常被用来制作极度轻量化的 Docker 基础镜像,所以我们在写 Dockerfile 时经常会用到它。
1 | # 更新索引并安装软件,不保留本地缓存以减小镜像体积 |