线上部署必须加--no-dev、--optimize-autoloader、--classmap-authoritative三参数,否则类加载失败或性能骤降;post-install-cmd默认不执行,需显式调用;远程部署须用ssh显式执行,敏感操作必加--no-interaction。

composer install 必须加的三个参数
不加 --no-dev、--optimize-autoloader、--classmap-authoritative 中任意一个,线上大概率类加载失败或性能骤降。
-
--no-dev:跳过require-dev里的包(如phpunit、infection),避免把开发工具打进生产环境 -
--optimize-autoloader:生成vendor/composer/autoload_classmap.php,绕过 PSR-4 动态扫描,类加载提速 50% 以上 -
--classmap-authoritative:强制 Composer 完全信任 classmap,不再 fallback 到文件系统查找——这是防止Class not found的最后一道防线
漏掉任一参数,CI 构建产物在线上运行时可能直接报错,不是“可能慢”,而是“根本找不到类”。
post-install-cmd 在部署机上不执行?不是 bug 是设计
因为 composer install --no-dev 默认禁用所有钩子脚本,post-install-cmd 不是“装完就跑”,而是“装完且未禁用时才跑”。CI 环境常设 COMPOSER_DEV_MODE=0,效果等同于 --no-dev。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 别指望它自动触发;必须显式调用:
composer run-script post-install-cmd --no-dev - 更推荐做法:把关键逻辑抽成独立脚本名(如
deploy:cache),再用composer run deploy:cache --no-dev显式执行 - 如果脚本里含
@php artisan config:clear这类命令,注意 Web 用户(如 www-data)和部署用户权限不同,storage/ 目录权限没同步会导致Permission denied
远程部署时不能只写 composer install
Composer 本身不是部署工具,post-install-cmd 默认在本地执行。把 rsync 或 ssh 命令硬塞进 scripts 里,本地一跑就炸。
- 真正可用的写法是显式远程调用:
ssh user@prod 'cd /var/www/app && composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction' - 敏感操作如数据库迁移,务必加
--no-interaction --force,否则脚本会卡住等输入 -
--no-interaction是自动化底线:它跳过所有交互提示(如许可证确认、配置选择),否则 CI 流程必然中断
scripts 字段写错位置或命名就等于没写
scripts 必须定义在 composer.json 根目录顶层对象里,嵌套在 extra 或其他字段中完全无效。
- 支持两类触发:隐式事件(如
post-install-cmd)和显式调用(如composer run deploy:sync) - 自定义脚本名(如
deploy:sync)不会自动触发,必须手动composer run调用 - 脚本值可以是字符串数组(顺序执行),但每条命令必须用
&&连接,否则前一步失败后一步仍会执行
实际部署中最容易被忽略的是:脚本里混用绝对路径、硬编码环境判断,或者没做 if [ "$CI" = "true" ]; then 兜底——一旦换环境或 CI 变量缺失,整个流程静默失败。










