post-install-cmd仅在vendor为空或composer.lock缺失/过期时触发,非每次install都执行;推荐改用post-autoload-dump确保autoloader变更后必运行。

post-install-cmd 不是每次 composer install 都会执行,别把它当“安装后必跑”的开关用。
为什么你的 post-install-cmd 有时根本不运行
它只在 vendor/ 为空或 composer.lock 不存在/过期时触发。如果已有完整 vendor 且 lock 文件没变,Composer 会跳过依赖解析和下载,直接复用 —— 此时 post-install-cmd 完全不调用。
- CI 环境中因缓存导致 vendor 未清空,钩子就静默失效
-
composer require或composer update也不会触发它 - 验证是否运行:加一句
echo 'hook fired',没输出就是被跳过了 - 想强制触发?删掉
vendor再试,但这不是日常解法
更稳的选择:用 post-autoload-dump 替代
post-autoload-dump 在每次生成或更新 vendor/autoload.php 后必执行,覆盖 install、update、甚至手动 dump-autoload 场景。适合做代码生成、配置注入、静态分析入口等「只要 autoloader 变了就得跑」的事。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它不保证所有依赖已完全加载(比如某些插件类可能还没进 autoload),别在其中调用尚未可用的类
- 注册方式和其他钩子一样:
"post-autoload-dump": ["MyClass::myHandler"] - 方法必须是
public static,否则报错Call to undefined method MyClass::myHandler() - 闭包、匿名函数不支持 —— Composer 无法序列化它们
脚本写法必须跨平台且防中断
字符串命令如 "php artisan config:clear" 在 Windows 或某些 CI 环境下容易因 shell 解析失败;数组形式才是安全底线。
- ✅ 推荐写法:
"post-update-cmd": ["@php", "artisan", "config:clear"](@php自动使用当前 PHP 可执行路径) - ❌ 危险写法:
"post-update-cmd": "php artisan config:clear && php artisan cache:clear"(&&在非 bash shell 下可能不识别) - 多个命令用数组顺序执行,任一失败则中断后续(这是默认行为,合理)
- 避免在脚本里调用
exec('composer install')—— 会递归触发自身,死锁
post-create-project-cmd 的真相
这个钩子只在别人用 composer create-project myvendor/myproject 安装你发布的模板项目时才生效,且必须由 myproject 自己的 composer.json 明确定义。你在自己本地项目里加了它,然后跑 install 或 update,它永远不会执行。
- 常见错误:复制 Laravel 模板的配置,但没注意那是为
create-project场景设计的 - 值必须是数组(哪怕只有一条命令),不能是字符串
- 此时
vendor尚未完全就位,composer dump-autoload类命令大概率失败 - 如果你的真实需求是“首次 install 后初始化”,用
post-install-cmd+ 文件存在判断更实际










