精确安装必须用冒号连接如monolog/monolog:1.2.3,空格或@、=均报错;纯数字三位版本号“1.2.3”才能锁死,^和~按SemVer严格约束升级范围,version字段不应手动写,真实版本唯一来源是Git tag。

composer require 后面的版本号必须用冒号连接
写成 composer require monolog/monolog:1.2.3 才能精确安装;写成 monolog/monolog@1.2.3 或 monolog/monolog=1.2.3 会报 Could not parse version constraint。冒号前后不能有空格,monolog/monolog : 1.2.3 同样失败。
写纯数字三位版本号才能真正锁死
只有 "monolog/monolog": "1.2.3"(无任何符号)会被 Composer 当作精确版本写入 composer.json,并在后续 composer install 中强制还原。其他写法哪怕只差一个字符,都不锁:
-
"monolog/monolog": "^1.2.3"→ 允许升到1.9.9 -
"monolog/monolog": "~1.2"→ 等价于^1.2.0,不是1.2.0 -
"monolog/monolog": "1.2"→ 多数 Composer 版本会解析为^1.2.0,部分版本直接报错 -
"monolog/monolog": "1.2.*"→ 模糊匹配,语义不明确,应避免
^ 和 ~ 的约束边界差异很大
它们不是“差不多”,而是按 SemVer 规则严格截断升级范围:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
^1.2.3表示>=1.2.3 <2.0.0:允许次版本和补丁升级(如1.9.0) -
~1.2.3表示>=1.2.3 <1.3.0:只允许补丁升级(如1.2.10),1.3.0被拦住 -
^0.2.3在 0.x 阶段行为反转:等价于~0.2.3,只允许补丁升级(0.2.4可,0.3.0不可)
如果包没发 1.2.3 这个 tag(比如只打了 1.2.2 和 1.3.0),~1.2.3 就永远匹配不到——得先用 composer show monolog/monolog --all 确认可用版本。
composer.json 里的 version 字段不该手动写
它不是“项目版本填写处”,而是 Composer 的特殊开关:一旦写了,就强制把包当成无 VCS 的本地包,忽略 Git tag、拒绝 Packagist 同步,下游 require 可能直接报 Could not find package。
- 真实版本唯一来源是 Git tag(如
v1.2.3),Packagist 自动解析为1.2.3 - 你写
"version": "1.0.0"又打了v2.0.0tag,Composer 仍坚持用1.0.0 - CI 里用
sed替换version是高危操作:导致composer.lock里的 commit hash 和 tag 元信息脱节
真正生效的发布动作是打 tag,不是改字段。版本号不是写出来的,是推出来的。

















