composer自定义命令分scripts脚本和composer-plugin插件两种机制:scripts需在composer.json根级配置、手动加载autoloader、传参用--分隔;插件必须声明type:"composer-plugin"、实现commandproviderinterface、继承basecommand,且安装后才出现在composer list中。

Composer 自定义命令行指令,不是加个 scripts 就能像 php artisan 那样自由调用的——它分“脚本别名”和“真插件命令”两条路,选错就永远不出现 composer list 里。
scripts 字段怎么配才真正可运行
这是最常用也最容易白忙活的方式。它不注册新命令,只是把键名映射成 shell 或 PHP 调用,所有行为都受限于 Composer 的执行模型。
- 必须放在
composer.json根层级,和require同级;嵌套在extra或config里直接无效 - 键名就是命令名:
"test:unit"→ 运行时得写composer run-script "test:unit"(带双引号,冒号在 shell 里有特殊含义) - 值支持字符串、字符串数组或
"MyClass::method"形式;但后者要求类已声明在autoload中,且必须是public static - PHP 回调不会自动加载
vendor/autoload.php,第一行得手动加require __DIR__ . '/../vendor/autoload.php'; - 传参必须用
--显式分隔:composer test -- --filter=TestFoo,否则参数被 Composer 吞掉
为什么你的命令没出现在 composer list 里
只有通过 composer-plugin 类型包 + CommandProviderInterface 实现的,才会被 composer list 扫描到。脚本命令永远不会出现。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"type": "composer-plugin"和兼容的"composer-plugin-api"版本(如"^2.0")必须声明 - 主类必须实现
ComposerPluginCommandProviderInterface,且getCommands()返回ComposerCommandBaseCommand实例数组 - 不能继承
SymfonyComponentConsoleCommandCommand—— 必须继承ComposerCommandBaseCommand,否则拿不到$this->getComposer() - 插件必须已安装(
composer require my/plugin或全局composer global require),本地开发路径需通过repositories指向 - 构造函数或
activate()抛异常会导致插件被静默跳过,不报错也不注册命令
PHP 回调里 Class not found 怎么快速定位
这不是 autoload 配置错了这么简单,而是 Composer 执行 scripts 时根本不加载 autoloader,连 vendor/autoload.php 都不碰。
- 检查
composer.json的autoload是否包含该类路径,例如:"psr-4": { "AppScripts\": "scripts/" } - 改完
autoload后必须运行composer dump-autoload,否则新路径不生效 - 确保类已声明在
autoload或autoload-dev中,并执行过composer dump-autoload - 回调方法必须是
public static,且不能直接new未声明 autoload 的第三方类(比如new IlluminateSupportStr会失败)
镜像配置与脚本执行环境的关系
镜像只影响 composer install/update 时的包下载,不影响 scripts 本身的执行逻辑,但会影响脚本中依赖的二进制工具是否可用。
- 如果脚本调用
vendor/bin/phpcs,而php-cs-fixer是 dev-only 依赖,--no-dev安装后该命令就不存在 - 镜像失效或配置错误(如
composer config repo.packagist composer https://packagist.org写错)会导致composer update卡住,进而让post-update-cmd永远不触发 - CI 环境中建议显式指定镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,避免因网络波动导致脚本中断 -
scripts不读取.env,环境变量要显式注入,比如"dev:start": "APP_ENV=dev php -S localhost:8000"
最关键的细节:脚本名含冒号(:)或与原生命令同名(如 install)时,composer xxx 语法糖会失效,必须用 composer run-script "xxx";而插件命令哪怕叫 install,也能共存——但你得确保用户知道他到底在调谁。










