项目上线或协作开发时应使用 composer install;它严格按 composer.lock 安装确保环境一致,而 composer update 会重新解析依赖树,可能引入不兼容更新,仅应在审查变更后精确升级依赖时使用。

composer install 和 composer update 到底该用哪个
项目上线或协作开发时,composer install 是唯一安全的选择;composer update 只应在明确要升级依赖、且已审查变更时使用。
原因很简单:composer install 严格按 composer.lock 安装,确保所有环境一致;而 composer update 会忽略 lock 文件,重新解析依赖树,可能引入不兼容的次要版本甚至破坏性更新。
- CI/CD 流水线里必须用
composer install --no-dev(生产环境禁用 dev 依赖) - 本地开发想试新版本?先
git status确认没未提交改动,再composer update vendor/package-name精确更新单个包 - 执行
composer update后,composer.lock必须提交到 Git —— 否则别人install就会还原成旧版本
require 和 require-dev 的边界怎么划
运行时真正需要的库进 require;仅在开发、测试、构建阶段用到的放 require-dev。错放会导致生产环境多装几十 MB 无用代码,还可能引发冲突。
典型误用:把 phpunit/phpunit、laravel/pint、symfony/var-dumper(仅用于本地调试)写进 require;或者把 doctrine/dbal(运行时迁移必需)漏进 require-dev。
-
composer install --no-dev会跳过require-dev,所以线上部署前务必验证功能是否完整 - 某些工具如
roave/security-advisories必须放require-dev,它本身不提供代码,只做安装时的冲突拦截 - 如果某个包在本地开发和线上行为不同(比如日志驱动切换),优先通过配置控制,而不是靠 dev/require 拆分
composer.lock 被忽略或没提交会怎样
只要 .gitignore 里写了 composer.lock,或者团队有人没提交它,项目就失去了依赖一致性保障 —— 这不是“可能出问题”,是“一定出问题”。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
现象包括:本地跑通,测试环境报 Class not found;PHP 版本相同但 json_encode() 行为异常(因 ext-json 版本浮动);CI 构建失败,错误信息指向某依赖的私有方法已被移除。
-
composer.lock必须和composer.json同时提交,且两者需语义匹配(比如 lock 文件里的platform配置要和 json 里config.platform.php一致) - 用 GitHub Actions 或 GitLab CI 时,检查第一步是否执行了
ls -la composer.lock,避免缓存导致误用旧 lock - 如果项目长期没更新依赖,lock 文件可能残留已废弃的 dist URL,此时
composer update --lock可仅刷新元数据,不改版本
PHP 版本约束写太宽或太死都危险
"php": "^7.4" 看似稳妥,实则埋雷:Composer 2.x 已不支持 PHP 7.4,而某些新包的 composer.json 可能声明 "php": ">=8.0",导致 install 直接失败,且错误提示模糊。
更常见的是锁死版本如 "php": "8.1.10" —— 这根本无效,Composer 不校验补丁号,且服务器 PHP 升级后反而无法安装。
- 应写成
"php": "^8.1"或"php": ">=8.1,,既留升级空间,又防跨大版本不兼容 - 在
config.platform中声明目标环境 PHP 版本,比如"platform": {"php": "8.2.0"},让 Composer 模拟该环境解析依赖 - CI 脚本中用
php -v和composer config platform.php双重校验,比单纯信 lock 文件更可靠
最常被跳过的其实是平台配置和 lock 文件的协同验证——很多人改了 composer.json 里的 PHP 版本,却忘了 composer update --lock 刷新 lock 中的 platform 声明,结果部署时才暴露不一致。










