^1.2.3 升至 1.9.9,~1.2.3 仅限 1.2.x;^ 锚定主版本(>=1.2.3 且 =1.2.3 且

写错 ^ 和 ~,不是“升级慢一点”,而是可能跳过安全补丁、卡死在旧版、甚至装上不兼容的 minor 版本——它们的语义完全不同,不能凭感觉互换。
为什么 ^1.2.3 会升到 1.9.9,但 ~1.2.3 却卡在 1.2.x
^ 锚定主版本(MAJOR),只要不跨 2.0.0 就算安全;~ 锚定最左侧非零段(这里是 1.2),只放开修订号(PATCH)。
-
^1.2.3≡>=1.2.3 :允许 <code>1.3.0、1.8.5、1.9.9,只要主版本还是1 -
~1.2.3≡>=1.2.3 :只允许 <code>1.2.4、1.2.10,1.3.0直接被排除 - 如果你依赖的包没严格守 SemVer(比如
1.3.0里偷偷改了 API),用^就可能出事;用~更保守,适合私有库或节奏不稳定的包
^0.5.0 和 ~0.5.0 看似一样,其实行为不同
0.x 阶段,Composer 把 minor 变更也视为 breaking change,所以 ^ 主动收紧锚点。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
^0.5.0≡>=0.5.0 (只放补丁,<code>0.6.0被拦) -
~0.5.0≡>=0.5.0 (此时效果相同) - 但
^0.0.4≡>=0.0.4 ,而 <code>~0.0.4≡>=0.0.4 ,两者又一致——关键看「最左侧非零段」在哪 - 别假设
^0.x能升0.x+1,它大概率不会
怎么写才能既更新补丁又不意外升 minor
明确目标:锁主+次,放开补丁。这不是靠猜,而是直接表达意图。
- 用
"10.10.*":等价于>=10.10.0 ,比 <code>~10.10.0更直白,且避免~10.10补零歧义(~10.10会被补成~10.10.0,但有人误以为是~10.10.x) - 避免写死
"10.10.0":它拒绝所有10.10.x的补丁更新,包括紧急安全修复 - 慎用
==10.10.0:强制精确匹配,连10.10.1都不认,CI/CD 流水线容易因此失败 - 生产环境靠
composer.lock固化,不是靠字符串“假装”锁定
composer why-not 是定位冲突的第一工具
报错 Your requirements could not be resolved 不是 Composer 故意卡你,是多个包的约束打架了。
- 先跑
composer why-not guzzlehttp/guzzle:7.5.0(把包名和你想装的版本代入),看谁在阻止 - 别急着删
composer.lock或降 PHP 版本——那只是掩盖问题 - 注意分支别名如
"dev-main":它不是版本,上线必须打正式 tag(如v1.2.0)并确保符合 SemVer 格式 -
version字段在composer.json里只是元信息,对依赖解析零影响;真正起作用的是require里的约束表达式
最容易被忽略的一点:你在本地 composer.json 里写的 version,哪怕写成 "dev-prod-stable",也不会让别人 require 时自动选它——除非你把它发布到 Packagist,并且对方显式写了你的包名和约束。










