vendor/package 名由 composer.json 中的 name 字段唯一确定,必须为小写字母、数字、下划线、中划线和单斜杠,且 vendor/package 是全局唯一标识符,决定安装路径、自动加载与依赖解析。

vendor/package 名字到底是谁定的
是你在 composer.json 里写死的 name 字段,不是目录名、不是 Git 仓库名、也不是你本地文件夹名。Composer 完全不看这些,只认 name。
常见错误现象:git clone 到本地改了文件夹叫 my-awesome-lib,但 composer.json 里还是 "name": "acme/utils" —— 那它就永远是 acme/utils,不会变成别的。
- 必须是小写字母、数字、下划线、中划线和斜杠,不能有空格或大写字母
- 斜杠前是 vendor(组织/作者名),后面是 package(包名),中间只能有一个斜杠
- vendor 名建议用 GitHub 用户名或公司域名倒序(比如
mycompany或com-mycompany),但没强制校验
为什么 vendor/package 不能随便起
因为它是全局唯一标识符,直接决定安装路径、自动加载规则、依赖解析逻辑。起重名或不规范,轻则本地装不上,重则别人 require 时拉错包。
使用场景:你在 Packagist 提交包、别人通过 composer require vendor/package 安装、PHP 自动加载器根据 vendor/package 映射到 src/ 下的命名空间。
- 如果
name是foo/bar,默认 PSR-4 自动加载会把Foo\Bar\指向src/,而不是src/Foo/Bar/ - 两个不同作者都用
utils当 package 名?那composer require utils根本没法解析——必须带 vendor - Packagist 不接受不含斜杠的
name,比如"name": "mylib"会直接被拒
本地开发时怎么避免名字冲突和加载失败
本地测试阶段最容易踩坑:名字写错了、自动加载没配对、或者用 path 仓库时路径和 name 对不上。
实操建议:
- 先在
composer.json定好"name": "yourname/your-package",再建目录结构 - 用
path类型仓库时,确保repositories里的路径指向包含正确composer.json的根目录,不是上层文件夹 -
composer dump-autoload -o后检查vendor/composer/autoload_psr4.php里有没有你预期的映射项 - 别依赖“文件夹名自动推导”——Composer 从不猜,只读
name和autoload
package 名里哪些字符绝对不能用
除了前面说的大小写字母限制,还有几个硬性禁区:
- 不能以点(
.)开头或结尾,比如.foo/bar或foo/bar. - 不能含冒号(
:)、等号(=)、竖线(|)——这些是 Composer 内部分隔符 - vendor 部分不能是
php、ext、lib这类保留字(虽不报错,但语义混乱,Packagist 可能拒绝) - package 部分别用
core、base、common这种泛称——没人知道你这“common”到底 common 了啥
最常被忽略的一点:改完 name 后,如果之前已 install 过旧名字的包,得先 composer remove vendor/old-name,再 composer require vendor/new-name,否则 Composer 会复用旧缓存,连 autoload 都不会刷新。











