安装依赖后触发的脚本只有 post-install-cmd 和 post-update-cmd:前者仅在首次 install 且 vendor/ 不存在时运行,后者在 lock 变更时可靠触发,适合生成 autoload 或清理缓存。

Composer 的 scripts 能在 composer install 或 composer update 后自动执行脚本,但默认只触发 post-install-cmd 和 post-update-cmd——而且它们不会在 CI 环境或 --no-scripts 下运行,这点必须提前确认。
哪些 scripts 会在安装依赖后触发?
真正“安装后”可用的只有两个钩子:post-install-cmd 和 post-update-cmd。前者仅在首次 composer install(且无 vendor/)时运行;后者在 composer update 或带 --force-install 的 install 时运行。两者不互斥,但行为不同:
-
post-install-cmd不保证每次install都执行——如果vendor/已存在且composer.lock未变,它可能被跳过 -
post-update-cmd更可靠,只要 lock 文件有变动就触发,适合做生成 autoload、清理缓存等操作 - 别用
post-autoload-dump替代——它只在 autoloader 重建时触发,和依赖是否新增无关
怎么写一个安全可用的 post-install-cmd 脚本?
直接写命令易出错,推荐封装为 PHP 方法或独立脚本,避免 shell 语法陷阱和路径问题:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json中定义:"scripts": { "post-install-cmd": [ "@php bin/build.php --stage=install", "chmod +x bin/deploy.sh && bin/deploy.sh" ] } - PHP 脚本里用
__DIR__定位项目根目录,别依赖getcwd()——Composer 可能在子目录调用 - 命令行脚本务必加
#!/usr/bin/env php头并设可执行权限,否则 Linux/macOS 下会报Permission denied - 避免在 scripts 里调用
composer dump-autoload——它会递归触发post-autoload-dump,可能造成循环
为什么本地能跑,CI 上却没执行?
常见原因就三个:
- CI 默认加了
--no-scripts参数(如某些 GitHub Actions 的 composer action),需显式删掉或加--no-interaction代替 - 用了
composer install --prefer-dist但没配"scripts": {"post-install-cmd": [...]}到 rootcomposer.json——子包的 scripts 不会上升到主项目 - 脚本返回非零退出码(比如 PHP 语法错误、文件不存在),Composer 会静默终止后续 scripts,且不报错,只在 verbose 模式(
-v)下可见Script ... handling the post-install-cmd event returned with error code 255
钩子不是万能胶,尤其涉及文件生成、权限变更或跨平台操作时,得盯住 exit code 和实际路径。最稳妥的做法:把关键逻辑抽成独立命令,先手动跑通再塞进 scripts。










