该用 composer install。它读取 composer.lock 严格复现已知可用依赖;composer update 则忽略 lock 文件,按 composer.json 重算并升级依赖,易致环境不一致。

composer install 和 composer update 到底该用哪个
新项目拉下来或换环境时,第一反应常是 composer install,但很多人顺手敲了 composer update,结果本地依赖版本和线上不一致,CI 构建失败、函数找不到、行为突变——问题就出在这儿。
composer install 读 composer.lock,严格复现已知可用的依赖树;composer update 忽略 lock 文件,按 composer.json 重新解析并升级到最新兼容版本,本质是「重算依赖」。
- 团队协作、上线部署、CI/CD 流水线:必须用
composer install(确保所有人用同一套包版本) - 主动升级某包(如修复安全漏洞):先改
composer.json,再执行composer update vendor/package-name,避免全量更新 - 没有
composer.lock?说明项目没走规范流程,install会退化成update行为,风险极高
多个项目共用全局 composer 配置?别这么干
有人把 ~/.composer/config.json 改成公司私有源地址,以为一劳永逸,结果新项目跑不起来——因为 composer 默认优先读项目根目录下的 composer.json,其次才是全局配置,但某些字段(比如 repositories)在全局里写死,会和项目内定义冲突,导致包解析失败或跳过私有源。
正确做法是让每个项目自己管自己的源:
- 项目初始化时,用
composer config repositories.packagist.org false关掉默认源 - 再加私有源:
composer config repositories.my-private type composer和composer config repositories.my-private url https://repo.example.com - 这些配置会写入项目级
composer.json的repositories字段,Git 提交后对所有人都生效 - 全局
config.json只保留极少数通用项,比如github-oauth或cache-dir
切换项目环境时 vendor 目录残留引发的 autoload 错误
常见现象:Class not found,但类文件明明在 vendor/ 下;或者 composer dump-autoload 后报错说找不到某个 PSR-4 映射路径。根本原因不是代码写错了,而是上个项目留下的 vendor/autoload.php 被复用,而它的 autoload_static.php 是生成时快照,不会自动感知当前项目的 composer.json 变更。
解决方式很简单,但容易被跳过:
- 每次切换项目前,确认当前目录是目标项目的根目录(含
composer.json) - 删掉旧
vendor/和composer.lock(如果要彻底干净) - 运行
composer install—— 它会重新生成vendor/autoload.php和所有静态映射 - 不要手动拷贝
vendor/目录跨项目,哪怕两个项目依赖完全一样
为什么 vendor/bin 下的二进制文件(如 phpunit)有时找不到命令
不是 PATH 没配,而是 vendor/bin 是软链接或相对路径引用,某些 shell(尤其是 Windows 的 Git Bash 或旧版 zsh)解析时出错;更常见的是,你用了 composer global require 装了全局工具,但项目里又通过 require-dev 装了同名工具(比如 phpunit/phpunit),此时 vendor/bin/phpunit 和 ~/.composer/vendor/bin/phpunit 版本可能打架。
推荐做法:
- 开发时一律用
./vendor/bin/phpunit(带./前缀,绕过 PATH 查找) - CI 脚本中也显式写完整路径,不依赖 shell 的 PATH 搜索顺序
- 删掉全局安装的 dev 工具:
composer global remove phpunit/phpunit,避免干扰 - 如果真要全局用,确保只装一个稳定版本,并定期
composer global update,但别混进项目依赖
多项目管理真正的复杂点不在命令本身,而在每个 composer.json 里 minimum-stability、prefer-stable、platform 这些字段的组合效果——它们静默影响着 install 能否成功、update 升到哪个版本、甚至是否允许加载 dev 分支。这些字段不报错,但会让依赖行为变得不可预测。










