生产环境必须用 composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction,缺一不可:--no-dev 排除开发依赖,--optimize-autoloader 生成静态类映射,--classmap-authoritative 强制仅查 classmap 提速,--no-interaction 避免 ci/cd 卡住。

生产环境必须用 composer install,且必须带 --no-dev 参数——漏掉这个,require-dev 里的包(比如 phpunit/phpunit)会照常装上,可能引发函数重定义、内存溢出或安全暴露。
为什么不能在生产环境跑 composer update
它会重新解析版本约束、忽略 composer.lock、拉取新补丁甚至次要版本,导致行为突变。哪怕只写 composer update monolog/monolog,也会触发整套依赖图重算,违反不可变部署原则。
- CI 构建阶段该跑
composer install --no-dev --optimize-autoloader,不是update - 生产服务器上禁止出现
composer update命令,哪怕加了--with-dependencies或指定包名 -
composer install遇到composer.lock和composer.json不一致时会报错:Your lock file does not contain a compatible set of packages,此时必须修复再部署,不能加--ignore-platform-reqs强行绕过
composer.lock 必须提交,且要验证是否最新
开发者忘记 git add composer.lock 是高频事故。CI 流水线里光靠人工 review 很难发现,得靠脚本拦截:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 推荐检查方式:
git diff --quiet composer.lock || (echo "ERROR: composer.lock has uncommitted changes" && exit 1) - 不推荐只用
composer update --dry-run后查文件状态,因为--dry-run不保证和当前composer.json完全等价 - PHP 版本升级(如从 8.1 → 8.2)后,
composer.lock可能隐式失效:某些包的platform-check逻辑会跳过安装,但不报错,只留空 vendor 目录
--no-dev 不只是“少装几个包”
它影响的是整个 autoloader 注册流程和运行时行为:
- 自动跳过
autoload-dev和require-dev中所有包的 autoload 配置,连其全局函数(如dump())都不会注册 - 某些包(如
symfony/var-dumper)在 dev 模式下会注入调试类到核心 autoloader,上线后残留可能直接导致Class not found或Function already defined -
--optimize-autoloader必须和--no-dev同时使用,否则 PSR-4 映射仍走动态查找,性能损失明显
最常被忽略的一点:私有包若用了 dev- 分支名(如 "acme/utils": "dev-main"),--no-dev 不会影响它——这个 dev- 是版本标识符,不是环境开关;真正的 dev 指的是 require-dev 字段下的包。










