composer安装本地插件本质是让主进程在install/update时加载实例化插件类,需配置path仓库、声明"type": "composer-plugin"、correct autoload及执行install/update;验证方式为composer show输出含types : composer-plugin。

Composer 安装本地插件,本质不是“安装”,而是让 Composer 在 install 或 update 阶段加载并实例化你的插件类。直接 composer require vendor/plugin:@dev 不会生效,除非你已提前配置好 path 类型仓库、插件结构合法、且自动加载路径正确。
怎么确认插件被 Composer 正确识别
运行 composer show vendor/plugin-name,输出中必须包含 types : composer-plugin。没有这一行,说明 Composer 根本没把它当插件——哪怕代码里有 Plugin 类、实现了 PluginInterface,也白搭。
常见卡点:
-
composer.json里缺"type": "composer-plugin"字段 -
extra.class指向的类名拼错,或命名空间与autoload映射不匹配 -
autoload用的是psr-4,但目录结构没对齐(比如声明"Acme\Plugin\": "src/",但实际类文件在src/Plugin/MyPlugin.php) - 插件项目根目录下
composer.json语法错误(多逗号、单引号、UTF-8 BOM),Composer 会静默跳过整个仓库
如何在测试项目中启用本地插件
不要在插件项目目录里执行 composer install。应该新建一个干净的测试项目,在它的 composer.json 中配置 path 仓库并 require 插件:
示例配置:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"require-dev": {
"your-vendor/your-plugin": "@dev"
},
"repositories": [
{
"type": "path",
"url": "../your-plugin-directory"
}
]
}
关键动作顺序:
- 确保
../your-plugin-directory/composer.json存在,且含合法name和"type": "composer-plugin" - 执行
composer require your-vendor/your-plugin:@dev --no-update(先不更新依赖) - 再执行
composer update your-vendor/your-plugin(强制触发插件加载逻辑) - 检查
vendor/your-vendor/your-plugin是否为符号链接(Linux/macOS)或目录(Windows)
为什么改了插件代码,composer update 却没反应
Composer 不监听文件变更,也不会自动重载已加载的插件类。它只在 install/update 时读取一次 autoloader 映射和插件类定义。
必须手动清理缓存并重建映射:
- 删掉
vendor/composer/autoload_psr4.php和vendor/composer/autoload_classmap.php - 运行
composer dump-autoload -o(加-o强制优化,避免旧路径残留) - 再跑
composer install(不是require)——这是唯一能重新触发插件activate()的方式 - 若仍不生效,可临时在插件的
activate()方法开头加file_put_contents('/tmp/plugin.log', 'activated', FILE_APPEND),确认是否真被调用
插件生效了,但自定义命令不出现
插件加载成功 ≠ 命令注册成功。命令暴露依赖两个硬性条件:
- 插件类必须实现
getCommands()方法,且返回非空数组(每个元素是继承自ComposerCommandBaseCommand的实例) - 命令类本身也必须能被自动加载(检查
autoload是否覆盖该类路径) - 运行
composer list,看命令是否出现在输出里;没出现就说明getCommands()没返回、或返回了无效对象 - 某些插件还需主项目
composer.json中额外配置extra字段才能启用命令(查插件文档)
最易忽略的一点:插件类构造函数如果依赖了未初始化的 Composer 内部服务(比如 ComposerPackagePackageInterface),会导致静默失败——无报错、不注册、也不报 warning。只保留 $composer 和 $io 两个参数最安全。










