composer.lock未提交则install退化为update,导致环境不一致;必须提交该文件,并用纯数字版本号(如"2.11.0")锁定依赖,配合--no-dev等参数部署。

composer.lock 文件没提交,install 就等于 update
不提交 composer.lock 到 Git,就等于放弃环境一致性。同一份 composer.json 在不同机器上运行 composer install,可能装出完全不同的依赖树——尤其当某个包刚发布了 2.1.5 补丁版,而你本地还停留在 2.1.4。
常见现象包括:
-
ls -l composer.lock返回 “No such file” 或被.gitignore意外屏蔽 - 部署日志里出现
Resolving dependencies—— 这说明它根本没读 lock,正在重新计算版本 -
git status显示composer.lock已修改但未提交,别人拉代码后install实际装的是自己本地解析出的版本
必须把 composer.lock 当作源码一部分:每次 composer update 或 composer require 后,立刻 git add composer.lock && git commit。
精确锁定某个包,只有一种写法
想锁死 monolog/monolog 不升级?"monolog/monolog": "^2.11" 或 "monolog/monolog": "2.11.*" 都不算锁定,补丁更新照样进。
真正生效的写法只有一种:
-
"monolog/monolog": "2.11.0"—— 三位全写,不带任何符号(无^、无~、无*、无v) - 改完后必须立刻执行
composer update monolog/monolog,否则composer.lock不会同步更新,等于白改 - 如果该包已装了新版想降级,用
composer require monolog/monolog:2.11.0(冒号后无空格、无v、无@),再删掉vendor/monolog/monolog和composer.lock中对应条目,避免缓存干扰
生产部署必须加的参数,少一个都算裸奔
composer install 本身不等于安全。没加关键参数,可能在生产机上执行脚本、加载开发依赖、甚至触发 ThinkPHP 的 post-install 清空 runtime 目录。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
标准部署命令是:
composer install --no-dev --no-scripts --no-autoloader --optimize-autoloader --no-interaction-
--no-dev:跳过require-dev,防止测试工具混入生产环境 -
--no-scripts:禁用post-install-cmd等钩子,避免意外副作用 -
--optimize-autoloader:生成扁平化类映射,提升加载性能 - CI/CD 流水线开头应加
composer config -g repo.packagist https://mirrors.aliyun.com/composer/,避免因镜像源失效导致拉包失败
prefer-stable 和 minimum-stability 必须成对出现
prefer-stable: true 单独存在毫无作用。它不是开关,只是排序规则:先由 minimum-stability 划出“谁能进池子”,再由 prefer-stable 决定“谁先被挑中”。
正确配置必须同时写在 composer.json 根级(和 require 并列):
{
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"php": "^8.1",
"monolog/monolog": "^3.0"
}
}
改完后必须运行 composer update(不是 install),否则 composer.lock 不重算,新配置形同虚设。
如果 composer.lock 里还存着旧的 dev-main 或 -beta 记录,composer install 会照装——它完全无视 prefer-stable。
最易被忽略的一点:PHP 版本变更后,composer.lock 可能失效。Composer 2.0+ 默认校验 platform 字段,不是“能跑就行”,而是“版本必须匹配声明”。一旦 composer.json 里 "php": "^8.1",但服务器实际是 8.0,install 会直接报错,而不是退而求其次。

















