post-install-cmd在部署机上不执行,是因为生产环境默认禁用脚本(--no-dev隐式跳过scripts),必须显式加--scripts参数或改用composer run-script调用独立脚本如deploy:setup。

post-install-cmd 为什么在部署机上不执行
因为 composer install 在生产环境默认跳过所有脚本——除非你显式启用。它不是“忘了跑”,而是设计如此:--no-dev 同时隐式禁用 scripts,哪怕你在 composer.json 里写了 post-install-cmd,它也不会触发。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 部署命令必须加
--no-scripts的反向操作:显式传--scripts(Composer 2.2+ 支持)或改用composer run-script post-install-cmd - 更稳妥的做法是把关键逻辑抽成独立 script 名,比如
"deploy:setup",再用composer run-script deploy:setup --no-dev显式调用 - 避免依赖
post-install-cmd做核心部署动作,它容易被 CI/CD 工具(如 GitHub Actions 的composer/installer-action)静默屏蔽
如何让 composer install 后自动拉取 Git 子模块或前端资源
直接写在 post-install-cmd 里调 git submodule update --init 或 npm ci && npm run build 是常见做法,但容易失败——尤其当 Node.js 或 Git 不在 PATH、或权限不足时。
实操建议:
- 所有 Shell 命令前加完整路径或环境校验,例如:
which git || exit 1; git submodule update --init - 前端构建建议封装为独立 script,如
"build:frontend": "cd resources && npm ci && npm run build",再由post-install-cmd调用,避免路径错乱 - 注意工作目录:Composer 执行脚本时当前路径是项目根目录,但某些命令(如
npm)可能依赖package.json位置,建议用cd显式切换 - CI 环境下常缺
.git目录,git submodule会报错;可加判断:if [ -d ".git" ]; then git submodule update --init; fi
部署脚本里要不要直接写 composer install --no-dev --optimize-autoloader
要,但不能只写这一句。它只是依赖安装环节,离“部署完成”差很远——缓存没清、配置没生成、storage 权限没设,上线后大概率 500。
实操建议:
- 把完整流程拆成可复用的 script,例如:
"install:prod": "composer install --no-dev --optimize-autoloader --no-interaction" - 后续步骤必须跟上权限修复和缓存清理:
"chmod -R 775 storage/ bootstrap/cache/"和"php artisan config:clear"(Laravel)或等效命令 - 不要在单行 script 里堆多个命令(如
"composer install && php artisan migrate"),失败点难定位;用数组形式分步写,Composer 会按序执行并中断于第一个失败项 - 如果迁移命令存在,务必前置环境判断:
if [ "$APP_ENV" = "production" ]; then php artisan migrate --force; fi
为什么 vendor 目录不能提交,但某些私有包又必须可用
因为 vendor/ 是生成物,不是源码——它由 composer.lock 精确还原,提交它会导致 diff 冗余、Git 仓库膨胀、协作冲突。
实操建议:
- 私有包走
repositories配置,用type: "package"或type: "vcs"指向 Git 地址,确保composer install能拉到 - 若因网络策略无法直连私仓,可在部署机预置
~/.composer/auth.json,或用COMPOSER_AUTH环境变量注入 token - 极少数场景(如离线环境)需打包
vendor/,应单独 tar 并上传到内部对象存储,而非塞进 Git;部署脚本用wget下载解压,再跳过composer install - 检查
composer.json中是否误含"minimum-stability": "dev",这会让--no-dev失效,导致 dev-only 包被意外安装
composer run-script 都该当作一次独立 shell 会话来设计,而不是本地开发的顺延。










