composer run-script 是手动别名而非自动钩子,需显式执行;自动化须用 post-install-cmd 等事件脚本,且注意触发条件、php 调用安全及钩子失败行为差异。

composer run-script 不是自动钩子,它只响应你手动敲的命令;真要自动化,得靠 post-install-cmd 这类事件脚本。
run-script 本质是手动别名,不是自动触发机制
很多人误以为 composer run-script 能替代钩子——它只是把字符串命令包装成可复用的名称,执行与否完全取决于你是否主动运行。它不绑定任何安装、更新流程,也不会在 composer install 后悄悄跑一遍。
- 写在
scripts里如"dev-start": "php -S localhost:8000 -t public",必须显式执行composer run-script dev-start才会启动服务器 - 如果想“每次 install 完自动清缓存”,不能只定义
"clear-cache": "php artisan cache:clear",还得把它挂到post-install-cmd里 -
composer run-script --list只显示你定义的所有脚本名,但不会告诉你哪些会被自动调用——只有带-cmd后缀的事件名(如post-install-cmd)才被 Composer 自动识别
post-install-cmd 和 post-update-cmd 触发条件完全不同
这两个是最常配错的钩子,根本区别不在“安装 vs 更新”,而在 vendor 目录状态和 lock 文件是否变化。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
post-install-cmd:仅当vendor/为空,或composer.lock不存在/过期需重生成时才触发。删了vendor后跑composer install会进;但已有完整vendor和匹配的lock,再跑install就静默跳过 -
post-update-cmd:只要执行composer update(哪怕只更新一个包),就一定触发;composer require xxx本质是update的语法糖,也走这个钩子 - 想统一行为?定义一个自定义脚本名(如
"build-assets"),然后在两个钩子里都写"@build-assets",避免逻辑重复
@php 是安全调用 PHP 的唯一推荐方式
直接写 php script.php 极易出问题:CI 环境可能用 php8.2 装 Composer,但系统默认 php 指向 php7.4,导致语法错误或扩展缺失。
- 一律用
@php前缀,例如:"@php scripts/generate-config.php",它自动复用当前 Composer 进程所用的 PHP 可执行文件 - 路径以项目根目录为基准,不要依赖
getcwd();脚本内部用__DIR__定位自身位置更可靠 - PHP 脚本里读配置,优先解析
composer.json文件本身,而不是靠$_ENV——Composer 不自动注入环境变量,$_SERVER['COMPOSER_DEV_MODE']是少数可用的内置标识
post-autoload-dump 比 post-update-cmd 更适合类相关操作
如果你的脚本要 new 一个刚装进来的类、或调用其静态方法,放在 post-update-cmd 里大概率失败——因为 autoloader 还没重建,类尚未注册。
-
post-autoload-dump在vendor/autoload.php写入完成后才触发,此时所有新包的类已可加载 - 它还会响应
composer dump-autoload,适合做纯 PHP 层初始化,比如注册自定义加载器、生成运行时代理类 - 别用
post-package-install:它不稳定、参数不可靠、文档明确不推荐;需要知道装了什么包,改用解析vendor/composer/installed.json更实际
最常被忽略的一点:钩子脚本失败默认不中断流程,除非你显式用 && 串联命令或在 PHP 脚本里 exit(1)。而 post-autoload-dump 这类关键钩子一旦失败,整个 composer install 或 update 会直接退出——这点在 CI 流水线里尤其要验证清楚。










