生产环境必须使用 composer install 并严格依赖已提交的 composer.lock 文件,禁用 composer update;需强制 --no-dev、验证 lock 一致性、适配 PHP 版本变更。

生产环境必须使用锁定的依赖版本,否则 composer install 可能拉取不兼容的新补丁或次要版本,导致运行时行为突变。关键不是“能不能锁”,而是“锁得是否可靠、部署时是否真用了锁”。
为什么 composer install 才真正读取 composer.lock
composer require 或 composer update 会改写 composer.lock,但不会在生产环境执行;而 composer install 严格按 composer.lock 安装,跳过版本解析——这是生产部署唯一安全的操作。
- CI/CD 流水线中,构建阶段应运行
composer install --no-dev --optimize-autoloader,确保只装生产依赖且 autoloader 高效 - 若本地没提交
composer.lock,composer install会退化为composer update行为(并生成新 lock),这在生产服务器上极其危险 -
composer install遇到composer.lock和composer.json不一致时会报错:Your lock file does not contain a compatible set of packages,此时必须先修复再部署,不能强行忽略
--no-dev 不是可选开关,是生产环境硬性要求
开发依赖(如 phpunit、laravel/pint)不仅浪费磁盘和内存,还可能引入意外的自动加载路径或运行时类冲突。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-dev会从autoload-dev和require-dev中彻底排除包,连其autoload配置都不会注册 - 某些包(如
symfony/var-dumper)在 dev 模式下会注册全局函数(如dump()),上线后残留可能引发Function already defined错误 - 不要依赖
"minimum-stability": "stable"或"prefer-stable": true来替代--no-dev——它们控制版本选择策略,不控制安装范围
CI 构建时必须验证 lock 文件是否最新
开发者忘记 git add composer.lock 是高频事故。仅靠人工 review 很难发现,需自动化拦截。
- 在 CI 的测试阶段末尾加检查命令:
composer update --dry-run --no-interaction && git status --porcelain composer.lock | grep -q '^??' && echo "ERROR: composer.lock not committed" && exit 1 || exit 0 - 更稳妥的做法是:CI 先运行
composer install,再执行git diff --quiet composer.lock,有差异就失败——说明本地 lock 未同步 - 禁止在生产服务器上运行
composer update,哪怕加了--with-dependencies或指定包名,都违背不可变部署原则
最常被忽略的一点:PHP 版本变更会间接导致 composer.lock 失效。例如从 PHP 8.1 升级到 8.2 后,某些包的 platform-check 或 conflict 规则可能触发重新解析,composer install 会拒绝执行并提示 Your platform settings require ... but you have ...。这时候必须在对应 PHP 版本下重新生成 lock,而不是绕过检查。

















