Composer包的name字段必须为全小写vendor/name格式,是全局唯一标识;vendor需与Packagist账号一致,package推荐kebab-case,仅允许ASCII字母、数字、-、_、.,单段或含大写/非法字符将导致install失败或autoload异常。

name字段必须是vendor/name格式,且全小写
Composer包的全局唯一标识就是composer.json里的name字段,它不是目录名、不是Git仓库名、也不是你本地文件夹名——Composer完全不看这些,只认这个字段。一旦写错,Packagist会直接拒绝提交,别人composer require也会失败。
常见错误现象:
-
name是单段(如"myapp"),Composer会自动补成"root/myapp",但root不是你在Packagist注册的vendor,导致依赖无法解析 - 含大写字母(如
"MyOrg/MyPackage"),在Linux+Git环境下可能因大小写敏感引发autoload失败 - 用了下划线或空格(如
"my_org/my-package"或"my app/my-package"),composer validate直接报is not a valid package name
正确写法必须满足:
- 两段式,中间一个
/,前后都非空 - 全部小写
- 只允许ASCII字母、数字、短横线
-、下划线_、点号. - vendor部分需与你在Packagist注册的用户名或组织名**完全一致**
vendor和package分别怎么选
vendor是你在Packagist上的“身份证前缀”,不是邮箱、不是域名、不是项目代号,就是你注册账号时用的那个用户名(比如GitHub用户名acme);package是你这个包的名字,推荐用短横线分隔单词(kebab-case),比如http-client,而不是httpClient或http_client。
使用场景差异:
- 如果你是个人开发者,
vendor通常就是你的GitHub用户名(如john-doe) - 如果是公司或组织,可用反写域名(如
com-example),但必须已在Packagist完成组织认证 -
package不能以数字开头(如3rd-party-sdk非法),也不能包含@、#、$等符号
性能与兼容性影响:名字里带点号.(如acme.foo/bar)虽被语法允许,但某些旧版工具链可能解析异常,建议避开。
name字段如何影响autoload和命名空间
name本身不强制绑定autoload规则,但很多模板和工具(包括composer init)会根据它推导PSR-4默认命名空间。比如name为acme/http-client,默认生成的PSR-4映射可能是{"Acme\HttpClient\": "src/"}——注意这是驼峰转换,且首字母大写。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
容易踩的坑:
- 实际代码里用了
App\命名空间,但name是acme/app,结果自动加载器找不到类 -
package含数字或连字符过多(如my-app-v2),转成命名空间后变成MyAppV2,而你代码里写了MyAppv2,Linux下直接Class not found - 手动配置了
autoload.psr-4,但忘了末尾反斜杠("Acme\HttpClient\": "src/"✅ vs"Acme\HttpClient": "src/"❌)
验证方式:改完name和autoload后,运行composer dump-autoload -o,再在测试脚本里var_dump(class_exists('Acme\HttpClient\Client'))确认是否真能加载。
本地开发阶段也必须严格按规范填name
哪怕你暂时不打算发布到Packagist,也别用root/xxx或留空,否则后续迁移成本极高:重命名name要同步改所有use语句、autoload配置、Git历史里所有引用,CI也可能因锁文件残留旧vendor信息而构建失败。
实操建议:
- 初始化时用
composer init --name="your-github-username/your-package-name",一步到位 - 之后每次修改
name,都立刻执行composer clear-cache,避免本地缓存干扰 - 发布前必跑
composer validate,它会检查name格式、必填字段、JSON语法等,比等到Packagist报错再改快得多
最常被忽略的一点:Git tag没推,Packagist就看不到版本。哪怕name完全合规,git tag v1.0.0之后必须git push origin v1.0.0,否则页面永远显示No releases found。










