composer的name字段必须全小写且用短横线分隔,因解析器严格校验:含大写字母或下划线会直接报“invalid package name”,且影响linux路径匹配、packagist提交、git版本控制及psr-4自动加载。

Composer 报 Invalid package name,基本就是 name 字段违反了硬性命名规则——不是风格建议,是解析器直接拒绝。
为什么 composer.json 的 name 必须全小写 + 短横线
Composer 在读取 name 时会做两件事:先校验格式,再用于路径拼接和自动加载推导。含大写字母或下划线会触发立即报错,例如:
Invalid package name "myvendor/my_package": Package names should be lowercase and use dashes for word separation
这不是警告,是解析中断。背后原因包括:
- Linux 文件系统大小写敏感,
src/MyPackage/和src/mypackage/是两个路径,但 Composer 默认按name推导命名空间时不会容错 - Packagist 提交页面直接拦截非法格式,连表单都提交不过去
- Git 在大小写不一致的文件名上容易丢变更(比如把
Helper.php改成helper.php,Windows 下可能没反应,Linux 容器里直接类找不到)
name 字段合法写法与典型错误对照
合法格式只有一种:两段式、全小写、仅用短横线分隔,中间一个 /。其他全是错的。
✅ 正确示例:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"name": "acme/json-helper"
"name": "mycompany/cache-driver-redis"
❌ 常见错误写法及对应报错关键词:
-
"myvendor/MyPackage"→ 报错含uppercase或must be lowercase -
"myvendor/my_package"→ 报错含underscore或use dashes -
"myvendor/my package"→ 报错含space或invalid character -
"myvendor/1api-client"→ 报错含must start with a letter(数字开头非法) -
"root/myapp"→ 本地能过,但别人composer require root/myapp会失败(root不是你 Packagist 账号)
改完 name 后必须同步做的三件事
只改 name 字段,90% 的人会立刻遇到 Class not found。因为 Composer 不会自动帮你重映射 autoload 或清理缓存。
- 更新
autoload.psr-4的命名空间前缀:如果原为"MyVendor\MyPackage\": "src/",保持命名空间本身不变(PHP 允许大小写),但确保src/下目录结构匹配 PSR-4,比如src/MyPackage/Helper.php对应namespace MyVendor\MyPackage; - 运行
composer dump-autoload -o重新生成映射表,别跳过-o(优化模式),否则vendor/composer/autoload_psr4.php里的路径可能还是旧的 - 清掉 Composer 全局缓存:
composer clear-cache,尤其之前用过错误包名执行过require,缓存里存着旧解析结果
私有仓库和本地开发也逃不开这套规则
有人以为“我只在公司内网用 Satis,不用发 Packagist,那名字随便点没事”——这是最危险的错觉。
私有仓库(Satis、Toran Proxy、Artifactory)同样调用 Composer 的 Package 解析逻辑,一样会校验 name 格式。更麻烦的是:
- 本地
composer require myvendor/my_package失败,错误信息里根本不会提“包名不合法”,而是Could not find package,让人误以为是源配置问题 - CI 流水线跑在 Linux 容器里,
composer install成功但运行时报Class not found,实际是name和src/目录大小写不一致导致路径拼错 - GitHub 仓库名叫
my_vendor,composer.json里写"myvendor/my_vendor",结果vendor小写但package含下划线,照样被拒
真正容易被忽略的,是改名后没验证 vendor/composer/autoload_psr4.php 里生成的路径是否和磁盘上 src/ 子目录名完全一致——差一个大小写,整个包就废了。










