post-install-cmd仅在首次install且vendor为空时触发,适合初始化;post-update-cmd更适配依赖变更后部署;需用环境变量或标记文件做环境隔离,失败默认中断安装,生产环境应保留该行为。

Composer install 后执行自定义脚本的正确姿势
Composer 本身不支持“安装后自动部署”,但可以通过 scripts 配置项在 install 或 update 完成时触发命令——关键在于选对事件钩子,而不是幻想它能直接调用 CI/CD 工具。
常见错误是把部署逻辑硬塞进 post-autoload-dump,结果发现它在 dump-autoload 时就执行了(比如你只改了 composer.json 但没装包),根本不是安装完成时机。
-
post-install-cmd:仅在首次composer install(且无vendor目录)时触发,适合初始化类任务 -
post-update-cmd:每次composer update或带--with-dependencies的 install 触发,更贴近“依赖变更后需部署”的场景 - 若想统一覆盖 install/update,直接用
post-autoload-dump并加判断:if [ -f "vendor/autoload.php" ]; then ...
部署脚本里别直接写 rsync 或 git pull
在 scripts 里直接调用 rsync -avz 或 git pull origin main 看似简单,实则埋雷:权限、路径、当前工作目录、环境变量全都不稳定。
Composer 执行脚本时的 cwd 是项目根目录,但 $_SERVER['HOME'] 可能指向 root 或 www-data,ssh 密钥、git config --global 用户信息往往缺失。
- 用绝对路径写部署目标,比如
/var/www/myapp/current,别用../prod - 所有外部命令显式指定用户上下文:
sudo -u www-data bash deploy.sh - 避免交互式操作:禁用
git pull的 credential helper,改用 deploy key +git -c core.sshCommand="ssh -i /path/to/key" pull
如何让钩子只在特定环境运行
本地开发时跑部署脚本纯属干扰,必须做环境隔离。Composer 不提供 if env == prod 语法,得靠外部信号控制。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
最可靠的方式是检查环境变量或文件存在性,而不是依赖 COMPOSER_HOME 或 phpversion() 这类易变指标。
- 在服务器上设
export APP_ENV=production,脚本开头加:if [ "$APP_ENV" != "production" ]; then exit 0; fi - 或检测部署标记文件:
if [ ! -f "/etc/myapp/deploy-enabled" ]; then exit 0; fi - 千万别用
php -r "echo getenv('APP_ENV');"—— Composer 脚本可能由不同 PHP SAPI(cli/fpm)启动,getenv行为不一致
钩子失败会导致 composer install 失败吗
会。默认情况下,任何 scripts 命令返回非零退出码,整个 composer install 就中断——这在部署失败时是合理行为,但在调试阶段反而阻碍开发。
权衡点在于:你希望部署失败阻断上线,还是允许继续安装并人工介入?
- 生产环境建议保留失败中断,避免半成品发布
- 调试时可在命令前加
|| true,例如:"post-update-cmd": "bash deploy.sh || true" - 更稳妥的做法是让部署脚本自身处理错误日志并返回 0,再通过监控告警,而非依赖 Composer 流程控制
真正麻烦的是钩子执行超时被 kill,或者 stdout/stderr 缓冲区满导致挂起——这类问题不会报错,只会卡住 composer install,得在脚本里加 set -o pipefail 和超时控制。

















