生产环境不能运行 composer install,因其会触发权限错误、脚本误执行、autoload 错乱等不可控行为;必须在 ci 或 docker 等干净环境中用 --no-dev --optimize-autoloader --no-interaction --no-scripts 构建 vendor 后整体部署。

为什么生产环境不能运行 composer install
因为 composer install 在线上执行会触发不可控行为:它默认尝试写 /root/.composer 缓存、生成 vendor/autoload.php、执行 post-install-cmd 脚本,而这些操作在 PHP-FPM 环境下极易因权限(如 www-data 无权写 vendor/)、SELinux 策略或超时失败。更危险的是,某些脚本会静默调用 php artisan key:generate 或清空缓存,直接破坏运行时状态。
正确部署流程必须隔离构建与运行环境
所有依赖安装必须在与线上 PHP 版本一致的干净环境中完成,比如 CI 流水线或本地 Docker 容器。关键点包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.lock必须已提交 Git,且内容与composer.json同步;否则--no-dev可能漏掉被 require-dev 间接依赖的 runtime 包 - 构建命令必须带完整参数:
composer install --no-dev --optimize-autoloader --no-interaction --no-scripts --prefer-dist - 构建完成后立刻打包:
tar -czf vendor.tar.gz vendor/,避免上传裸目录导致.gitignore漏掉隐藏文件 - 上线时只解压代码 + 解压 vendor,不运行任何 Composer 命令
生产服务器上必须禁用 composer 二进制
删掉或移走 /usr/bin/composer 或 ~/.composer/vendor/bin/composer,防止误操作。如果必须保留,至少设为 chmod 000。原因很简单:哪怕加了 --no-dev,只要没加 --no-scripts 和 --no-plugins,Laravel 的 post-install-cmd 或旧版 hirak/prestissimo 插件仍可能被触发——而这类行为在线上是不可审计、不可回滚的。
容易被忽略的兼容性细节
构建环境的 PHP 小版本必须 ≥ composer.json 中 "platform": {"php": "8.1"} 所声明的版本,否则 Composer 会降级拉包,上线后报 Class not found 却查不到原因。另外,--optimize-autoloader 会强制启用 classmap-authoritative 行为,这意味着未在 autoload 规则中声明的类(比如通过 include_once 动态加载的 helper)将彻底无法加载——这个错误在线上才会暴露,开发时反而“侥幸”跑得通。










