composer强制包名全小写且仅允许短横线分隔,含大写字母、下划线或空格会触发硬性校验失败,composer validate直接报错,无法通过install或require;vendor名须与packagist账号完全一致,且name字段必须为vendor/package-name格式。

Composer 无法安装含大写字母的包名,不是它“不支持”,而是直接拒绝解析——name 字段含大写字母会触发硬性校验失败,连 composer validate 都过不去,更别说 install 或 require。
为什么 composer validate 会报 Invalid package name
Composer 在读取 composer.json 时,会对 name 字段做底层字符串校验:只要出现任意一个大写字母(如 MyVendor/MyPackage)、下划线(my_vendor/my_package)或空格,就立刻抛出错误:
Invalid package name "MyVendor/MyPackage": Package names should be lowercase and use dashes for word separation
这不是警告,是阻断式错误。校验逻辑写死在 Composer 源码的 PackageLoaderRootPackageLoader 中,不依赖 Packagist、不走网络、本地就能触发。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 大小写敏感 ≠ 大小写允许:Linux 文件系统、Git 索引、PSR-4 自动加载路径三者都严格区分大小写,但 Composer 的包名规范是独立于这些的强制约定
- 别指望“自动转小写”:虽然
composer require MyVendor/MyPackage可能在某些旧版本里被悄悄转成myvendor/mypackage,但这只是临时兼容行为,且只发生在 require 参数层面,composer.json里的name仍必须合法 - vendor 名部分也受约束:哪怕你 Packagist 账号是
AcmeCorp,name里也不能写AcmeCorp/toolkit,必须是acmecorp/toolkit
改名后类还是找不到?autoload 没同步更新
把 "name": "MyVendor/MyPackage" 改成 "name": "myvendor/my-package" 只是第一步。如果没同步调整 autoload.psr-4 和实际文件结构,composer dump-autoload 生成的映射依然指向错误路径,结果就是 Class not found。
- 命名空间前缀不等于包名:例如
"autoload": {"psr-4": {"MyVendor\MyPackage": "src/"}是合法的,即使包名是myvendor/my-package;但此时src/下必须有MyPackage/Helper.php,且文件内声明namespace MyVendorMyPackage - 目录名大小写必须和 PSR-4 映射完全一致:写的是
"MyVendor\MyPackage": "src/",就不能把目录建为src/mypackage/或src/my-package/ - 运行
composer dump-autoload -o后,打开vendor/composer/autoload_psr4.php,检查数组键(命名空间)对应的路径值是否和磁盘上真实路径逐字符匹配(包括大小写)
GitHub 仓库名和 composer.json name 能不一样吗
能,而且应该不一样。GitHub 仓库名(myvendor/my_package)是 Git 层概念,composer.json 的 name(myvendor/my-package)是 PHP 包生态层标识——两者解耦,但混淆是新手最常踩的坑。
- 你在 GitHub 创建仓库叫
myvendor/my_package,完全没问题;但composer.json里必须写"name": "myvendor/my-package" -
composer require myvendor/my_package必然失败,因为 Packagist 上不存在这个包名;正确命令是composer require myvendor/my-package - 私有仓库(如 Satis、Toran Proxy)同样执行相同校验,不能靠“内部绕过”来掩盖问题
- 如果你已用错误格式发布过旧包,Packagist 不支持改名,只能弃用旧包、新建合规包并迁移文档和依赖方
真正麻烦的从来不是改几个字符,而是在 Linux 容器里跑一次 composer install 才暴露的路径大小写错位,或是别人 require 时因 vendor 名不匹配导致的 404 —— 这些都不会在 Windows 本地开发时报错,但上线就崩。










