extra字段必须写在项目根目录composer.json的顶层键,值为JSON-serializable类型,键名建议小写字母+下划线;插件通过$composer->getPackage()->getExtra()读取,需空值判断,且仅install/update后生效。

extra字段写在哪、怎么写才生效
必须写在项目根目录的 composer.json 里,且是顶层键(和 require、scripts 同级),不是插件或包的配置位置。
- 写错层级(比如嵌套在
extra.foo下再塞一个extra)会导致数据完全不可见 - 值只能是 JSON-serializable 类型:字符串、数字、布尔、数组、null;不能是对象、资源、闭包
- 键名建议用小写字母+下划线,避免大写或中划线——部分插件解析时对大小写敏感,且 Composer 自身对键名不做标准化处理
- 示例正确写法:
{"extra": {"my-plugin-config": {"timeout": 30, "enabled": true}}}
插件如何读取 extra 里的数据
Composer 插件通过 Event 对象访问 Composer\Composer 实例,再调用 getPackage()->getExtra() 获取整个 extra 数组。
- 常见错误:直接读
$event->getComposer()->getPackage()->getExtra()['my-key']却没做空值判断,一旦 key 不存在就报Undefined index - 安全读法应始终用
array_key_exists()或三元 + null 合并(??),例如:$config = $composer->getPackage()->getExtra()['my-plugin-config'] ?? [];
- 注意:只有在 install/update 后生成的
vendor/composer/installed.json中才会固化extra数据;开发时改了composer.json必须重新 runcomposer install才能被插件读到
extra 和 scripts 传参的区别在哪
extra 是静态配置,全局可用、生命周期长;scripts 中的命令行参数是临时、一次性的,两者定位完全不同。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果你需要在
post-install-cmd脚本里用某个开关控制行为,extra更合适;若只是某次调试想传个 flag,用composer run-script xxx -- --debug更轻量 -
extra数据会被写入installed.json,所有依赖该包的项目都能间接读取(只要插件支持);而 scripts 参数只在当前执行上下文有效 - 性能上无差异,但滥用
extra存大量数据(如 base64 图片、长文本)会拖慢composer install解析速度,也增大installed.json体积
为什么我的 extra 数据插件收不到
最常见原因是插件没监听正确的事件,或 Composer 版本太低导致 API 不兼容。
- 确认插件是否注册了
post-install-cmd或post-update-cmd等事件——extra在pre-*阶段还不可用,因为composer.json尚未完全加载完成 - 检查 Composer 版本:
extra的完整支持从 Composer 2.0 开始稳定;1.x 中部分插件实现不一致,尤其涉及嵌套数组时容易丢键 - 运行
composer show -s查看已启用插件列表,确保你的插件确实在运行;有些插件默认禁用,需在extra里显式开启开关(如"enable-my-plugin": true) - 调试技巧:在插件中临时加
var_dump($composer->getPackage()->getExtra()); die;,看输出是否符合预期
实际用的时候,extra 看似简单,但它的加载时机、作用域和插件事件链耦合得很紧。漏掉一次 composer install,或者 event 注册错一个字母,数据就静默消失了。

















