composer install 和 update 的核心区别在于是否读取并遵守 composer.lock 文件:install 严格按 lock 安装确定版本,确保环境一致;update 忽略 lock、重算依赖并更新锁文件,仅用于本地主动升级。

composer install 和 composer update 不是手速问题,是环境是否可控的问题——用错一个,线上就可能挂。
该跑 install 还是 update?看有没有 composer.lock
刚拉完项目代码,第一反应不是查文档,而是执行 ls -la composer.lock。有锁文件,无脑跑 composer install;没锁文件,说明团队协作流程已断裂,别急着装,先确认是否该由负责人生成并提交一份。
-
composer install只读composer.lock,装的是里面写死的版本号,CI/CD、生产部署、新同事 setup 必须用它 -
composer update会忽略composer.lock,重新解析composer.json并重写锁文件,只应在本地验证安全补丁、升级主框架(如 Laravel 11)、或调试兼容性时运行 - 裸跑
composer update极易引入子依赖不兼容——比如只升guzzlehttp/guzzle,但它的psr/http-client还卡在 v1.0,运行时报错才去查 changelog 就晚了 - 只想更新单个包?用
composer update monolog/monolog,加--with-dependencies可连带更新其直系依赖
加依赖必须用 require,但参数错一个就埋雷
手写 composer.json 再 install 是低效且危险的路径:漏逗号、引号不闭合、版本写成 "7.5" 而非 "^7.5",都会导致后续解析失败或装错版本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 开发工具(如
phpunit/phpunit、phpstan/phpstan)必须加--dev,否则进require区,上线也会加载,徒增内存和启动开销 - 指定版本必须带约束符:
composer require guzzlehttp/guzzle:^7.5(推荐),而不是7.5(会被解释为严格等于7.5.0,基本匹配不到) - 只想改
composer.json不安装?加--no-update,例如composer require symfony/console --no-update,后续可单独composer update symfony/console - 遇到
Your requirements could not be resolved且确认是 PHP 版本限制(如本地 PHP 8.3,但包声明只支持 8.2),可临时加--ignore-platform-reqs强装——但别提交,CI 禁用
Class not found?90% 不是命名空间错了,是 autoloader 没刷新
新增 PSR-4 目录、改了 autoload 配置、甚至只是改了 files 类型的全局函数文件(如 src/functions.php),Composer 都不会自动感知。不手动刷新,类永远找不到。
- 必须运行
composer dump-autoload才能重建映射 - 开发中频繁加类又不想每次
update,加-o生成 classmap:composer dump-autoload -o,比默认 PSR-4 查找快不少 - 生产环境进一步提速?用
composer dump-autoload --optimize --classmap-authoritative,但注意:--classmap-authoritative会跳过 PSR-4 动态查找,新增类必须重新 dump,否则直接报错 -
vendor/autoload.php必须放在入口文件最前面——PHP 自动加载是一次性注册机制,一旦某个类名被首次引用而未定义,就会触发 fatal error,后续的require_once补救完全无效
global 命令装的命令为什么找不到?PATH 没配对
composer global require laravel/installer 不是“装完就能用”,它把可执行文件放到了 Composer 自己管理的 bin 目录(通常是 ~/.composer/vendor/bin),shell 找不到,自然报 command not found。
- 检查是否已将该目录加入
$PATH:echo $PATH | grep composer - 若没有,追加到 shell 配置文件(如
~/.zshrc):export PATH="$HOME/.composer/vendor/bin:$PATH",然后source ~/.zshrc - 装完后验证:
which laravel或laravel --version - 注意:global 安装的包是用户级的,不能替代系统级命令,也不建议在 CI 脚本中使用
composer.lock 文件是否被 .gitignore 错误排除,或者有人修改后忘记提交——这会导致所有协作者和 CI 构建出完全不同的依赖树,而错误往往在上线后几小时才暴露。










