Composer强制包名全小写且仅允许短横线分隔,如acme/json-helper;含大写字母、下划线或非常规符号将直接报错,且PSR-4自动加载路径须与文件系统大小写严格一致。

Composer 会把所有包名强制转成小写再处理,所以 MyVendor/MyPackage、MYVENDOR/MYPACKAGE 和 myvendor/mypackage 最终都指向同一个包——前提是 Packagist 上存在对应的小写版本。但你不能依赖这个“自动修正”来写错名字,因为本地开发、自动加载、Git 协作和 Linux 部署环节全都会出问题。
composer.json 的 name 字段必须全小写
这是硬性要求,不是建议。Composer 在解析 name 时会直接校验:含大写字母或下划线就报错,例如 "myvendor/my_package" 会触发 Invalid package name "myvendor/my_package": Package names should be lowercase and use dashes for word separation。
-
name必须是vendor/package-name格式,全部小写,单词间只允许用短横线(-),比如acme/json-helper - 不能用下划线(
_)、点号(.)开头或结尾,也不能连续出现两个短横线(--) - vendor 部分最好与 Packagist 账号一致,否则别人
require时会找不到包 - 如果本地测试阶段用了错误格式,后续发布到 Packagist 会被直接拒绝,连提交页面都进不去
PSR-4 自动加载路径大小写必须和文件系统一致
Composer 不管你 name 写得对不对,它只按 autoload.psr-4 配置去映射路径。但 PHP 加载类时,Linux 下文件路径严格区分大小写,src/Utils/Config.php 和 src/utils/config.php 是两个不同文件。
- 命名空间前缀如
"Acme\JsonHelper\": "src/",意味着类Acme\JsonHelper\Parser必须在src/Parser.php,且文件内声明namespace Acme\JsonHelper; - 目录名
src/JsonHelper/不能写成src/jsonhelper/或src/Json_helper/,否则dump-autoload生成的映射也无效 - 运行
composer dump-autoload -o后,打开vendor/composer/autoload_psr4.php,检查数组键值里的路径是否和磁盘上真实路径完全一致(包括大小写) - Windows 下能跑 ≠ 正确,用
docker run --rm -v $(pwd):/app -w /app php:8.2-cli composer install在 Linux 容器里验证一次,基本就能暴露所有路径大小写问题
Git 对文件名大小写变更默认不追踪
你在 macOS 或 Windows 上把 Helper.php 重命名为 helper.php,git status 很可能没反应——因为 Git 默认认为这是同一个文件。等推到远程,Linux 服务器拉下来就只剩一个空文件或直接丢失。
- 立刻执行
git config core.ignorecase,如果输出true,说明当前仓库已关闭大小写敏感 - 临时修复:先
git config core.ignorecase false,再git rm --cached Helper.php,然后git add helper.php - 团队应统一在项目根目录加
.gitattributes,写入* text=auto eol=lf,并配合 pre-commit 钩子检查文件名是否符合 kebab-case 或 PascalCase 约定 - 别信 “我本地能 new 出来”,CI 流水线一跑 Linux 构建就挂,这种问题往往卡在上线前最后一刻
最常被忽略的一点:改了 name 之后,autoload.psr-4 的命名空间前缀不一定需要同步改,但 src 目录下的实际文件结构和类内 namespace 声明必须跟新 name 推导出的逻辑一致;否则 composer dump-autoload 生成的映射就是错的,而 Composer 从不报这类“映射错但语法对”的警告。











