composer install 严格按 composer.lock 安装确切版本,确保环境一致;composer update 忽略 lock 文件,重算依赖并更新锁,仅限开发时主动升级。有 lock 就用 install,无 lock 或需升级才用 update。

别信“中文命令”——Composer 原生不支持中文指令,所有所谓“中文命令”都是误传或封装脚本,用它等于主动放弃错误提示、版本兼容性和团队协作基础。
composer install 和 composer update 到底该用哪个
看项目里有没有 composer.lock 文件:有,就无条件跑 composer install;没有,或者你明确要升级某个包(比如修安全漏洞),才用 composer update。
常见错误现象:composer update 在 CI/CD 脚本里出现 → 构建结果每次都不一样 → 凌晨 3 点线上报错 Class not found 或 Method not found。
-
composer install只读composer.lock,装的是里面记录的**确切版本号**,快、稳、可复现 -
composer update忽略composer.lock,按composer.json重算整个依赖图,会改锁文件,可能引入不兼容变更(比如 monolog v2 升 v3 后LoggerInterface方法签名变了) - 首次运行
composer install时若无composer.lock,它会自动 fallback 到update并生成锁文件——这看似方便,实则绕过团队约定,建议初始化后立刻git add composer.lock
加依赖必须用 composer require,不是手写 composer.json
手写 JSON 容易逗号多写、引号漏闭、缩进错乱,composer require 是唯一安全路径:它自动校验约束、写入对应字段(require 或 require-dev)、执行安装、更新锁文件。
使用场景:装 PHPStan、PHPUnit、Laravel Pint 这类开发期工具,必须加 --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 vendor/package-name,比如composer update monolog/monolog,别裸跑update
autoload 不生效?先跑 composer dump-autoload
90% 的 Class not found 报错,不是命名空间写错,是 autoloader 没刷新。Composer 不监听文件系统变化,新增 PSR-4 目录、改了 "files" 配置、甚至只是加了个新类文件,都得手动触发重生成。
典型场景:你在 app/Helpers/ 下写了 StrHelper.php,composer.json 里配了 "files": ["app/Helpers/functions.php"],但跑起来报错——不是路径错了,是没跑 composer dump-autoload。
- 加
-o(即--optimize-autoloader)可生成 classmap,比默认 PSR-4 查找快,但仅适合生产环境构建,开发中不用 - 改了
"files"类型的文件(比如全局函数文件),也得重 dump,否则不会生效 - 调试映射失效?用
composer dump-autoload -a强制重生成所有 autoload 规则
为什么 composer require 有时装不上
报错 Your requirements could not be resolved,不是网络问题,是版本冲突。Composer 在尝试把你要加的包,和已有的其他依赖(尤其是 PHP 版本、扩展、已有包的约束)对齐失败。
常见诱因:composer.json 里写了 "php": "^8.0",但你要装的包只支持 ^8.2;或者两个已装包各自要求 monolog/monolog:^2 和 ^3,直接冲突。
- 先运行
composer why-not vendor/package-name:version,看谁在拦路 - 临时缓解子依赖冲突可加
--with-all-dependencies,但副作用大,慎用 - 本地 PHP 版本高(如 8.3),但包声明只支持 8.2?可临时加
--ignore-platform-reqs强装,但别提交,CI 会禁用
真正麻烦的从来不是命令记不住,而是搞不清 install 和 update 的语义边界、分不清 require 和 require-dev 的部署影响、以及忘了 dump-autoload 这个“隐形开关”。这些点一旦出错,问题往往藏得深、复现难、回滚慢。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











