composer中无“自定义指令”概念,仅有scripts(脚本别名)和commandprovider插件(真正新命令)两种机制;scripts是composer.json中"scripts"字段定义的快捷执行键,不新增命令;commandprovider需实现接口、声明插件类型、正确注册命令类方可生效。

Composer 里没有“自定义指令”这个独立概念——你真正能用的只有两种机制:scripts(脚本别名)和 CommandProvider 插件(真正的新命令)。选错路径,90% 的问题都出在混淆这两者。
scripts 是什么,什么时候该用它
scripts 就是 composer.json 顶层的 "scripts" 字段,本质是 shell 命令或 PHP 方法调用的快捷方式。它不新增命令,只提供可执行的键名。
- 适合项目级一次性操作:比如
"test": "phpunit"、"fix-cs": "php-cs-fixer fix" - 支持数组写法,按顺序执行:
"build": ["rm -rf build/", "mkdir build", "cp -r src/ build/"] - 可用
@xxx复用已有脚本:"dev": ["@install", "@test"] - 不能直接传参给 PHP 方法;想传参必须用
--分隔,且脚本内要手动解析$_SERVER['argv']或读环境变量 - PHP 类方法调用需满足:类已声明在
autoload中、方法为public static、执行过composer dump-autoload
CommandProvider 插件才是真正的“新命令”
只有实现 Composer\Plugin\CommandProviderInterface 的插件,才能让 composer my:command 这种形式生效。这不是配置,是代码扩展。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 你的包
composer.json必须声明"type": "composer-plugin",缺这个字段,Composer 直接跳过整个包 -
extra.command-provider(推荐)或旧版extra.class必须填全限定类名,例如"Acme\MyPlugin\CommandProvider",不能带.php后缀 - 该类必须实现
getCommands(),返回一个Composer\Command\BaseCommand实例数组,不是字符串、不是闭包 - 命令类必须继承
Composer\Command\BaseCommand(不是Symfony\Component\Console\Command\Command),否则拿不到$this->getComposer() - 运行
composer show --plugins是第一排查步骤:没出现在列表里,说明插件根本没加载,别急着查命令类
为什么你的自定义命令“找不到”或“没反应”
绝大多数失败不是代码写错了,而是加载链断在了前几环。
-
composer my:command报Command "my:command" is not defined:先跑composer show --plugins,不在列表里就不用往下看了 - 脚本执行后静默退出或报
Class not found:scripts 不自动加载 autoloader,PHP 脚本第一行得写require __DIR__ . '/../vendor/autoload.php'; - Windows 下脚本失败率高:避免
&&、|、单引号,优先用vendor/bin/phpunit而非裸phpunit - 全局插件中
$this->getComposer()可能返回null(比如当前没项目目录),必须判空再用 - 插件类构造函数里抛异常、访问未注入的
$io,会导致 Composer 静默跳过该插件,不报错也不注册命令
真正难的不是写命令,是让 Composer 找到它——插件类型、接口实现、自动加载路径、API 版本声明,四者缺一不可。漏掉任何一个,composer list 就永远看不到你的命令。










