Composer 拒绝 myvendor/my_package 因其包名必须全小写且用短横线分隔,下划线和大写字母均非法;需同步修改 composer.json 的 name、PSR-4 命名空间映射路径,并执行 dump-autoload。

Composer 不接受大写字母或下划线的包名,vendor/package_name 这种写法会直接报错——它只认全小写、连字符分隔的格式,比如 vendor/package-name。
为什么 Composer 拒绝 myvendor/my_package?
Composer 的包名解析逻辑底层依赖 PSR-4 自动加载和 URL 安全性校验。下划线(_)在 PHP 命名空间中虽合法,但在 Composer 的包标识符(package name)中被明确禁止;大写字母则会导致 vendor 名称校验失败,因为 Composer 会强制将 vendor 名标准化为小写,并拒绝后续含大写的包名组合。
-
composer.json中的"name"字段必须是vendor/name格式,且全部小写 - 下划线会被视为非法字符,触发错误:
Invalid package name "myvendor/my_package": Package names should be lowercase and use dashes for word separation - 即使本地
require时用了别名,发布到 Packagist 时仍会因命名不合规被拒
正确改名的三步实操(含 autoload 同步)
改名不是只改 composer.json 里的 "name",还要确保命名空间与文件结构一致,否则自动加载会失效。
- 把
"name"改成全小写+短横线,例如从"myvendor/my_package"→"myvendor/my-package" - 同步更新
"autoload"的"psr-4"映射:如果原为"MyVendor\MyPackage\": "src/",需确保命名空间MyVendorMyPackage在代码中保持不变(命名空间本身允许大小写和下划线),但目录路径应匹配 PSR-4 规范——即src/MyPackage/而非src/My_Package/ - 运行
composer dump-autoload验证,再执行composer install确保无缓存干扰;若之前已发布过旧包名,需在 Packagist 上弃用旧包并提交新包
常见踩坑场景:GitHub 仓库名 vs Composer 包名
很多人以为 GitHub 仓库叫 myvendor/my_package,那 Composer 包名也该这么写——这是最大误区。两者完全解耦,且 Composer 包名必须遵守其自身规范。
- GitHub 仓库名可以含下划线、大写,不影响;但
composer.json的"name"必须小写+短横线 - 若你用
composer require myvendor/my_package,而实际包名是myvendor/my-package,会报Could not find package myvendor/my_package - 私有仓库(如 Satis 或 Toran Proxy)同样校验包名格式,不能绕过
最常被忽略的是:改完 composer.json 后没清 Composer 缓存,或没同步更新 autoload 映射路径,导致类找不到——这时候错误信息里根本不会提“包名不合法”,而是抛出 Class not found,容易误判为代码问题。











