composer 自定义命令插件必须满足三条件:实现 plugininterface、composer.json 中声明 "type": "composer-plugin"、getcapabilities() 显式返回 commandprovider 能力;否则命令不会出现在 composer list 中。

Composer 自定义命令插件不是“写个类就能用”,它必须满足三个硬性条件:实现 PluginInterface、composer.json 中声明 "type": "composer-plugin"、并通过 getCapabilities() 显式暴露命令提供能力——缺一不可,否则 composer my:command 永远不会出现在 composer list 里。
怎么让 Composer 认出你的命令?关键在 getCapabilities()
很多人写了 Command 类、也注册了 Plugin,但 composer list 就是不显示新命令。根本原因是:Composer 2.x 不再自动扫描命令,必须由插件主动声明自己“能提供命令”。
-
getCapabilities()必须返回一个数组,键为'ComposerPluginCapabilityCommandProvider'(注意拼写和命名空间),值为你实现CommandProvider的类名全限定名 - 这个
CommandProvider类本身不需要实现接口,但必须提供getCommands()方法,返回SymfonyComponentConsoleCommandCommand实例数组 - 不能把命令逻辑直接塞进
activate();activate()只负责“报备能力”,真正实例化命令是在 Composer CLI 初始化阶段按需调用getCommands()
为什么命令执行时报 Class not found?autoload 和路径必须严丝合缝
常见错误是命令类文件存在、命名空间也对,但运行时仍报 Class 'MyPluginMyCommand' not found。这不是 Composer 插件机制的问题,而是 PSR-4 加载失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.json的autoload["psr-4"]必须精确映射到源码目录,比如"MyPlugin\": "src/",那么src/MyCommand.php就必须以namespace MyPlugin;开头 - 插件主类(如
Plugin.php)和命令类(如MyCommand.php)必须在同一个 autoload 规则下,或各自有独立且无冲突的规则 - 本地测试时,务必在目标项目中运行
composer dump-autoload,否则新注册的类可能未被扫描进自动加载映射
调试命令不生效?别信 composer install -v,要用 composer my:command -v
很多开发者习惯用 install 或 update 命令加 -v 看插件是否加载,但这只能验证插件被激活,无法验证命令是否注册成功。
- 最直接的验证方式是运行你自定义的命令本身:
composer your:command -v,观察是否进入命令的execute()方法 - 在命令的
execute()中加$io->writeError('debug: hit')(注意用writeError,避免被静音) - 如果命令根本不出现在
composer list输出里,优先检查getCapabilities()返回值是否拼错,尤其是ComposerPluginCapabilityCommandProvider这个字符串——大小写、反斜杠、空格,错一个就失效
最易被忽略的一点:命令类构造函数里别依赖 $composer 或 $io。它们只在插件 activate() 时传入,而命令实例化是独立发生的,此时这两个对象根本不可用。所有上下文信息,必须通过命令的 execute(InputInterface $input, OutputInterface $output) 参数传递进来。










