合法包名必须是 vendor/name 格式,全小写且仅含字母、数字、下划线、中划线和点,vendor 不能为 php/composer 等保留字,如 "monolog/monolog";require 是运行时依赖,require-dev 是开发期依赖;autoload 必须明确定义路径,type、license、description 缺一不可。

composer.json 里 package name 怎么写才合法
包名必须是 vendor/name 格式,全小写,只含字母、数字、下划线、中划线和点,且 vendor 名不能是 php、composer 这类保留字。
- 合法示例:
"name": "monolog/monolog"、"name": "acme/utils" - 常见错误:
"name": "MyLibrary"(缺 vendor)、"name": "Acme/Utils"(大写)、"name": "acme/utils-v2"(虽然语法合法,但语义混乱,建议用 version 字段控制) - vendor 名最好和 GitHub 组织名一致,否则 Packagist 同步会失败或被拒
require 和 require-dev 的区别到底在哪
require 是运行时依赖,装包时默认安装;require-dev 是开发期依赖,比如测试工具、代码检查器,执行 composer install --no-dev 时不会装它们。
- 误把
phpunit/phpunit放进require:会导致用户项目无端多出测试框架,还可能引发版本冲突 - 误把
symfony/console放进require-dev:如果包本身提供命令行工具,运行时就直接报Class not found - PHP 版本约束必须写在
require里,如"php": "^8.1",否则 Packagist 不识别兼容性
autoload 配置写错,类根本不会被找到
Composer 不会自动扫描文件,所有可加载的类路径都得明确定义在 autoload 或 autoload-dev 下。
-
"psr-4": {"Acme\": "src/"}:要求src/Foo.php里声明namespace Acme;,且类名必须匹配文件名 - 漏掉末尾反斜杠:
"Acme": "src/"是错的,会触发 PSR-4 规范警告,实际也可能加载失败 - 想加载全局函数或常量?用
files数组:"autoload": {"files": ["src/helpers.php"]},注意路径是相对于composer.json的 - 开发时改了
autoload,别忘了跑composer dump-autoload,否则修改不生效
发布前最容易被忽略的三个字段
type、autoload、license 看似可选,但少一个就可能让包无法被正确使用或收录。
-
"type": "library"必须写,否则 Packagist 当作普通项目不索引;如果是命令行工具,用"type": "project"或"type": "metapackage" -
"license": "MIT"缺失会导致 Packagist 显示 “Unknown license”,很多公司 CI 会直接拒绝引入 -
"description"虽不强制,但空着的话 Packagist 页面一片空白,没人知道这包干啥——连composer search都搜不到关键词
写完别急着 push,先本地跑 composer validate,它能立刻指出格式错误、字段缺失或命名违规。Packagist 不接受验证失败的包,重试成本比改一行 JSON 高得多。











