composer 只识别"type": "composer-plugin"且extra.class指向实现plugininterface的类的包为插件;需配合psr-4 autoload映射,否则类无法加载,activate()不会调用。

Composer 本身不支持“插件”这种概念——你写的不是 Composer 插件,而是 composer-plugin 类型的包,它通过 Composer 的事件钩子(如 post-install-cmd)或自定义命令注入行为。
怎么让 Composer 认出你的扩展是插件?
关键在 composer.json 的两个字段:
-
"type": "composer-plugin"—— 必须设为这个值,否则 Composer 不会加载它 -
"extra": { "class": "Your\Plugin\Class" }—— 指定入口类,该类必须实现ComposerPluginPluginInterface
别漏掉 autoload 配置,否则类找不到。推荐用 PSR-4:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"autoload": {
"psr-4": {
"Your\Plugin\": "src/"
}
}
为什么 post-install-cmd 不生效?
因为 post-install-cmd 是项目级脚本,不是插件机制的一部分。插件要响应事件,得靠 activate() 方法里注册监听器:
- 监听
InstallerEvent或PostInstallEvent,而不是写scripts字段 - 确保插件被安装到根项目(
require --dev),且类型正确,否则activate()根本不会调用 - 调试时加
echo或写日志到sys_get_temp_dir(),因为 Composer 默认静默执行
中文路径/文件名导致插件读取失败?
PHP 的 file_exists()、glob() 在 Windows 和部分 Linux 环境下对 UTF-8 路径支持不稳定,尤其当插件尝试扫描 vendor 下含中文名的包时:
- 避免直接拼接路径处理中文文件名,改用
composer/semver或ComposerPackageLoaderJsonLoader解析composer.lock - 如果必须操作路径,统一用
mb_convert_encoding($path, 'UTF-8', 'auto')做兼容转换 - 测试务必在真实中文路径的项目中运行(比如
D:我的项目),CI 环境默认英文路径会掩盖问题
插件加载时机早于大部分用户代码,但晚于 Composer 自身 autoloader 初始化——这意味着你不能依赖项目里的类,除非它们已声明在插件自己的 require 里。










