composer scripts 需显式触发且严格依赖配置:脚本须定义在 composer.json 顶层 scripts 字段,php 回调类需被 autoload 正确加载,生命周期钩子仅在对应命令实际执行时触发,回调须为 public static function(event $event) 签名。

Composer scripts 定义后不执行?检查 autoload 和脚本类型
Composer 的 scripts 不是写完就自动跑的,它只在明确触发时执行(比如 composer install、composer run test),不会因文件变更或目录切换悄悄运行。
常见误操作:把脚本写在 autoload 里,或者当成 PSR-4 自动加载逻辑来用——这两者完全无关。scripts 是 shell 命令或 PHP 回调,不是类加载配置。
- 确保脚本定义在
composer.json的顶层scripts字段下,不是嵌套在autoload或require里 - PHP 类型脚本(如
"post-install-cmd": "My\Script::run")要求该类已能被 Composer 自动加载(即在autoload中声明了对应命名空间 + 路径) - 命令行类型脚本(如
"test": "phpunit")依赖系统 PATH 或项目 bin 目录,vendor/bin/默认不在 PATH 中,建议用./vendor/bin/phpunit显式调用
生命周期钩子(如 post-install-cmd)没触发?确认事件触发条件
Composer 的生命周期钩子不是“每次 composer 命令都跑一遍”,而是严格绑定具体命令和执行阶段(pre / post)。例如 post-install-cmd 只在 composer install 成功完成安装后触发,composer update 不会触发它。
容易混淆的是:composer install 在已有 vendor/ 且 composer.lock 未变时,会跳过安装过程,此时 post-install-cmd 也不会执行——它只响应“真正执行了安装动作”的场景。
- 想让脚本在
install和update都运行,需同时定义post-install-cmd和post-update-cmd -
pre-autoload-dump和post-autoload-dump在每次生成自动加载文件时触发(包括install/update/手动dump-autoload),适合做 classmap 注入或 stub 修改 - 钩子执行顺序固定:pre → 主命令 → post;若主命令失败(如依赖解析失败),post 钩子不会执行
PHP 回调脚本报 Class not found?autoload 没生效或命名空间错位
用 "post-root-package-install": "MyBuildInstaller::doSomething" 这种写法时,错误往往不是脚本本身,而是 Composer 根本没加载到那个类——因为 autoload 配置没覆盖到该路径,或 PSR-4 映射路径写错了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
注意:Composer 在执行脚本前,会先构建 autoloader,但仅使用 composer.json 中的 autoload 配置,不会临时读取脚本所在文件的 require 或 include。
- 检查
autoload的psr-4是否包含该类的命名空间,且路径指向正确目录(末尾带/,且是相对于composer.json的路径) - 运行
composer dump-autoload -o后再试,避免 dev-only autoload 规则未生效 - 调试技巧:在回调方法开头加
file_put_contents('debug.log', print_r(get_included_files(), true), FILE_APPEND);,确认 autoloader 是否加载了你的文件
脚本中访问 Composer 对象或当前包信息?用 $event 参数,别硬编码
PHP 类型钩子接收一个 ComposerScriptEvent 实例作为参数,里面封装了当前运行上下文。直接硬编码包名、版本或 vendor 目录路径,会导致脚本无法复用或在不同环境出错。
例如想获取当前项目名称,不要写 'myapp',而应从 $event->getComposer()->getPackage()->getName() 动态读取;想改 vendor 路径,用 $event->getComposer()->getConfig()->get('vendor-dir'),而不是假设为 vendor/。
-
$event->getIO()提供输入输出接口,支持isInteractive()、writeError()等,比直接echo更健壮 -
$event->getArguments()可拿到composer run-script xxx -- arg1 arg2中的额外参数 - 回调函数签名必须为
public static function doSomething(Event $event),少一个参数或类型不对,Composer 就会静默跳过
钩子执行时机和上下文边界很窄,很多问题其实出在“以为它该运行”而不是“它确实该运行”。最常漏掉的是:没确认命令是否真触发了对应事件、autoload 路径拼写多了一个点、或回调方法不是 static。这些地方一错,脚本就彻底静音,连报错都不会有。










