合法值包括"library"(默认)、"project"、"metapackage"、"composer-plugin"及框架专用类型如"wordpress-plugin"等,大小写敏感且必须为官方认可字符串。

composer.json 里的 type 字段有哪些合法值
只有字符串,且必须是 Composer 官方认可的几个固定值之一,大小写敏感,不能是数组、布尔或空字符串。type 不是标签,不是描述,是工具链识别包角色的“开关”。
-
"library":默认值,不写也按这个处理;表示可被其他项目require的通用类库,自动加载生效,安装进vendor/ -
"project":表示完整可运行应用(如 Laravel 项目),create-project的目标,不应被require到别人项目里 -
"metapackage":纯依赖声明包,自身不含 PHP 文件,发布到 Packagist 时会被校验(含源码会警告) -
"composer-plugin":仅当包需扩展 Composer 行为(比如自定义安装逻辑)时使用,Composer 会主动加载其Plugin类 - 框架专用类型如
"wordpress-plugin"、"cakephp-plugin"等——必须配合对应 installer 才有效,否则退化为"library"
怎么查已安装包的 type 值
别翻源码或猜,直接读 Composer 缓存文件。它反映的是当前 vendor/ 里真实安装状态,不是你本地 composer.json 的草稿。
- 查单个包:
composer show laravel/framework,输出里找type行 - 批量查所有包的 type:
composer show --format=json | jq '.[].type'(需提前装jq) - 手动看缓存:
cat vendor/composer/installed.json | jq '.[] | select(.name == "monolog/monolog") | .type' - 注意:如果刚改过
composer.json但没composer update,show命令仍显示旧值
设错 type 会出什么问题
命令行本身不会报错,composer install 照常跑完——但下游工具和协作场景会悄悄崩。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把实际是
library的包设成"project":Packagist 可能拒收;别人require你时,某些 CI 或部署脚本会跳过或报 warning - 把
project设成"library":别人误require进自己项目,可能带入冲突的autoload、重复的index.php,甚至覆盖入口逻辑 - 写成
"Library"或"lib":Composer 当作无效值,降级为默认"library",但 Packagist 发布时可能拒绝 - metapackage 里放了
src/目录或写了autoload:Packagist 会提示 “metapackages must not contain any files”
什么时候该改 type,怎么改才安全
改 type 不是修 bug,是调整语义契约。改之前先确认:你的包到底供谁用、怎么集成、被哪些工具链消费。
- 从零写一个通用组件(比如日志适配器)→ 显式加
"type": "library",哪怕它是默认值,也避免后续误判 - 基于 Laravel 模板初始化一个新站点 → 必须设
"type": "project",并删掉所有require自己框架 dev 分支的写法 - 打包一套“开箱即用”的依赖组合(如 PHP 8.3 + Doctrine + Twig 最小栈)→ 用
"type": "metapackage",清空src、注释掉autoload - 写了个自定义 installer 插件 →
"type": "composer-plugin"是硬性前提,缺了这行,Composer 根本不会加载你的插件类
最常被忽略的一点:type 改了之后,一定要同步检查 autoload、require 和发布策略——它不是孤立字段,而是整套协作假设的起点。










