轻量级 composer 功能扩展包本质是普通 library,无需实现 plugininterface 或监听事件;仅需正确配置 autoload、bin 入口和 path 仓库即可快速开发与本地调试,适用于 cli 工具、配置生成器等手动触发场景。

轻量级 Composer 功能扩展包 ≠ 插件,也不需要监听事件或改安装逻辑 —— 它只是个普通 library 类型包,靠自动加载 + 命令行调用就能生效。如果你只是想封装一段可复用的 CLI 工具、配置生成器、或项目初始化脚本,没必要上 composer-plugin 那套机制,否则反而增加维护成本和兼容风险。
怎么判断该用 library 还是 composer-plugin?
看你的“功能扩展”是否必须在 Composer 执行过程中介入:
- 需要在
composer install后自动执行某段逻辑(比如生成配置、检查环境)→ 选composer-plugin - 只是提供一个命令,比如
php vendor/bin/mytool init,由人手动触发 → 用library+bin即可 - 想让别人在
require你包后,直接在项目里use你的类 → 必须是library,且正确配置autoload
绝大多数“轻量扩展”属于第二种或第三种场景。强行做成插件,会卡在 composer-plugin-api 版本约束、PHP 限制、甚至被某些 CI 环境禁用插件加载。
用 library 类型快速搭出可用扩展包
核心就三步:命名规范、自动加载声明、可执行入口。不需要写任何接口实现。
-
composer.json中设置"type": "library"(默认值,可省略) -
"autoload"必须配对"psr-4",例如:{"MyTool\": "src/"} - 在
bin/目录下放可执行脚本,比如bin/mytool,开头加#!/usr/bin/env php -
composer.json中声明"bin": ["bin/mytool"],这样composer install后会软链到vendor/bin/mytool - 脚本内用
require __DIR__.'/../vendor/autoload.php';加载依赖,再new MyToolCli()启动
示例 bin/mytool 内容:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
#!/usr/bin/env php <?php require __DIR__.'/../vendor/autoload.php'; $cli = new MyToolCli(); $cli->run($argv);
本地开发时如何实时测试,不发包也不 push?
别急着 git push 和 packagist submit。直接在目标项目中用 path 仓库方式引入:
- 在目标项目的
composer.json的"repositories"下加一条:{"type": "path", "url": "../mytool"}(../mytool是你本地扩展包根目录) - 然后运行
composer require myvendor/mytool:dev-main(分支名按你本地 git 分支来) - 改
src/里的代码,立刻生效;改bin/脚本,重新运行composer install就能更新软链
这个方式绕过 Packagist、跳过版本 tag、不依赖网络,适合调试阶段。注意 path 仓库不支持 require-dev 传递,如有测试依赖需手动装到主项目。
容易被忽略的兼容性细节
轻量包最容易栽在两个地方:
-
composer.json里没写"minimum-stability": "stable",又没打stabletag,会导致require时拉不到dev-main分支(尤其在 CI 或 --no-dev 环境) -
bin/脚本没有 Unix 换行符(),Windows 下生成的会让 Linux/macOS 的#!/usr/bin/env php解析失败,报bad interpreter - PSR-4 命名空间和文件路径大小写不一致(比如命名空间写
MyTool,但文件夹叫mytool/),Windows 开发机不报错,Linux 上直接Class not found
真正轻量的扩展包,价值不在“能做什么”,而在“改一行代码、跑一次命令、立刻验证结果”。把 library 当成工具箱,而不是框架层组件,才能保持简单可控。










