dev-main 被当成 9999999-dev 是因 Composer 2.2+ 默认映射且 branch-alias 仅在被其他包版本约束引用时生效,须写在被依赖包 composer.json 的 extra 中,格式为 "dev-main": "2.0.x-dev",并确保分支名精确匹配、无 version 冲突。

dev-main 被当成 1.0.0?branch-alias 不生效的典型表现
你改了 composer.json 里的 "branch-alias",但 composer require vendor/package:dev-main 还是拉不到预期版本,甚至报错说找不到包——根本原因是 Composer 2.2+ 默认把 dev-main 自动映射成 9999999-dev,压根不看你写的别名。别名只在「该分支被其他包通过版本约束显式引用时」才起作用,比如 "vendor/package": "^2.0" 想匹配到 dev-main,才需要它。
-
branch-alias必须写在被依赖包(即你要发版的那个包)的composer.json里,不是写在你自己项目里 - 别名值必须是合法的稳定版本格式,例如
"dev-main": "2.0.x-dev",不能写"dev-main": "2.x-dev"(x 不是数字) - 别名只影响 Packagist 上的元数据解析,本地
composer install时不会重新生成别名,要清缓存或等 Packagist 重新抓取
怎么让 dev-main 正确对应 2.0.x-dev 版本号
核心就一条:在被发布包的 composer.json 的 extra 段里加 branch-alias,且分支名必须和实际 Git 分支名完全一致(包括大小写)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"name": "myorg/mylib",
"extra": {
"branch-alias": {
"dev-main": "2.0.x-dev"
}
}
}
- 分支名写错(比如写成
"main"或"dev-main "带空格)会导致别名彻底失效 - 如果主干是
dev-develop,就得写"dev-develop": "1.5.x-dev",别硬套main - 别名生效后,Packagist 页面上该分支会显示为
2.0.x-dev,composer show myorg/mylib也能看到这个版本号
为什么 require dev-main 仍然装不上?检查这三处
即使别名配置正确,composer require myorg/mylib:dev-main 仍失败,大概率卡在这几个地方:
- 目标包还没提交到 Packagist,或没触发自动更新(Push 后需等待几分钟,或手动点击 Packagist 上的 “Update”)
- 你的项目
composer.json中minimum-stability是stable,而dev-main是dev稳定性级别,必须显式允许:"minimum-stability": "dev"或加"prefer-stable": true并用^2.0替代dev-main - 本地 Composer 缓存了旧的元数据,运行
composer clear-cache再试
branch-alias 和 version 字段冲突怎么办
如果包里同时写了 version 字段(如 "version": "2.0.0"),Composer 会直接忽略 branch-alias,优先按 version 解析。这是硬规则,不是 bug。
- 发布正式版时,删掉
version字段,靠 Git tag(如v2.0.0)驱动版本识别 - 开发分支不要写
version,只靠branch-alias提供语义化别名 - CI 打包前自动注入
version是高危操作,容易导致别名失效且难以排查

















