composer install 依据 composer.lock 安装确切版本,确保环境一致;composer update 根据 composer.json 重新解析并升级依赖,更新 lock 文件。

当你在 PHP 项目中使用 Composer 时,composer update 和 composer install 是最常用的两个命令。虽然它们看起来相似,但背后的工作流程和用途完全不同。理解它们的真正工作流程,有助于避免部署问题、依赖不一致和版本冲突。
composer install:按 lock 文件安装依赖
这个命令的目标是**精确还原当前项目的依赖环境**,确保所有开发者和生产环境使用完全相同的依赖版本。
工作流程如下:
- 检查项目根目录是否存在 composer.lock 文件
- 如果存在,则直接读取该文件中记录的包名和确切版本(如 "monolog/monolog": "1.29.0")
- 从 Packagist 或配置的镜像源下载这些指定版本的包
- 将包安装到 vendor/ 目录下
- 生成或更新自动加载文件(autoload.php)
如果没有 composer.lock 文件,composer install 会退化为类似 composer update 的行为:解析 composer.json 中的版本约束,安装最新匹配版本,并生成新的 composer.lock。
典型使用场景: 部署生产环境、新成员克隆项目后初始化依赖。强调“一致性”。
composer update:重新解析并升级依赖
这个命令的作用是**根据 composer.json 中的版本约束,尝试升级所有符合条件的依赖到最新版本**。
工作流程如下:
- 读取 composer.json 文件中的依赖及其版本约束(如 "^1.2" 或 "~2.0")
- 向 Packagist 发起请求,获取满足约束的最新可用版本
- 执行依赖解析算法,解决各包之间的版本兼容性问题
- 下载新版本的包并覆盖 vendor 目录中的旧文件
- 更新 composer.lock 文件,记录新的版本信息
- 重建自动加载文件
你可以选择更新全部依赖,也可以指定包进行局部更新,例如:
composer update monolog/monolog
典型使用场景: 主动升级依赖以获取新功能或安全补丁。强调“更新”。
关键区别总结
两者的核心差异在于是否尊重 lock 文件:
- composer install:优先使用 composer.lock,保证安装结果可预测
- composer update:忽略 composer.lock,重新计算依赖树,可能导致版本变动
团队协作中,composer.lock 应该提交到版本控制系统(如 Git),这样所有成员运行 composer install 都能得到一致的结果。
常见误区与建议
很多人误以为 composer install 也会“智能升级”,实际上它不会,除非没有 lock 文件。
建议操作流程:
- 开发阶段需要升级依赖时使用 composer update
- 更新后提交新的 composer.lock,以便他人同步变更
- 部署服务器上只运行 composer install,不执行 update
- CI/CD 流水线中也应使用 install,确保构建可重复
基本上就这些。掌握这两个命令的本质区别,能让你更安全地管理 PHP 项目的依赖。










