composer报错invalid version string或version string is too long,是因为composer.json中version字段含空格、中文、超190字符或非法预发布格式;它须严格遵循semver 2.0子集,推荐写法如"1.2.3"、"1.2.3-beta.1"、"1.2.3+20240501",禁用"dev-main"、"v1.2.3"等;最佳实践是删除version字段,由git tag(如v1.2.3)自动推导版本。

Composer 报错 Invalid version string 或 Version string is too long,基本是因为你在 composer.json 的 version 字段里写了非法或超长的版本号 —— 比如带空格、含中文、超过 190 字符,或用了 Composer 不认的预发布格式。
为什么 version 字段不能随便写
Composer 内部用 Composer\Semver\VersionParser 解析版本,它严格遵循 Semantic Versioning 2.0 的子集,并额外限制总长度 ≤ 190 字符。常见踩坑点:
-
version值不是纯字符串(比如写了1.0.0-beta.1+20240501是合法的,但1.0.0-beta.1 (dev)含空格和括号就直接报Invalid version string) - 用了 Git 描述符如
v1.0.0-12-gabcdef—— 这是git describe输出,不是语义化版本,Composer 不接受 - 手动拼接了长哈希或时间戳,例如
1.0.0-dev-20240501123456-8a3f9c2d1e4b5a6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c,极易超长 - 在私有包中误把
dist.reference当成版本号填进version字段
自定义包该用什么格式写 version
如果你控制包源码(比如内部工具库),version 应该只出现在 composer.json 中,且必须满足:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 格式为
X.Y.Z[-prerelease][+build],其中prerelease只能含 ASCII 字母、数字、点(.)和连字符(-),不能有下划线、斜杠、空格 - 推荐写法:
"version": "1.2.3"(稳定版)、"version": "1.2.3-beta.1"(预发布)、"version": "1.2.3+20240501"(构建标识) - 绝对不要写
"version": "dev-main"或"version": "v1.2.3"—— 前者是分支名,后者多出的v前缀不被 SemVer 认可 - 如果想关联 Git 提交,应通过
dist配置的reference字段,而非version
不用 version 字段也能发布私有包
多数情况下,你根本不需要手动设 version。Composer 更推荐让包“无版本”,靠 VCS(Git)自动推导:
- 删掉
composer.json中的version字段(留空或干脆删除) - 确保 Git 仓库打过符合 SemVer 的 tag,例如
git tag v1.2.3(注意带v前缀是常见习惯,但 tag 名本身只是标识,Composer 会自动截掉v解析为1.2.3) - 在私有 Packagist(如 Satis、Private Packagist)或
repositories中配置为vcs类型,Composer 会从 tag 和 commit 自动提取版本 - 这样既避免手误,又支持
composer require vendor/pkg:dev-main或:1.2.*等灵活约束
真正容易被忽略的是:当你用 composer install --no-plugins 或在 CI 中禁用插件时,某些自动生成 version 的脚本会失效,此时若 composer.json 里残留错误 version 字段,就会暴露问题。所以最稳的做法,是本地开发阶段就删掉它,让版本完全由 Git tag 驱动。










