~1.2.3 允许 1.2.3 到 1.2.999 的版本,因 ~ 锁定最后非零位(修订号),1.3.0 跨越次版本号被禁止;等价于 >=1.2.3

~ 不是“差不多就行”,它按你写的最后一位非零数字卡死升级边界:写到修订号(如 ~1.2.3),就只允许 1.2.x;写到次版本号(如 ~1.2),就允许 1.2.x 到 1.99.999,但绝不跨 2.0.0。
~1.2.3 允许哪些版本?为什么 1.3.0 被拦住?
它等价于 >=1.2.3 ,数学上非常明确:
-
1.2.4、1.2.15、1.2.999都合法 -
1.3.0一丁点都不让进——哪怕只是文档 typo 修复 -
1.2.2也不行,因为低于最小版本要求
这个边界由你写的位数决定:~1.2.3 的 “3” 是修订号,所以次版本号(2)就被锁死了。别指望它自动“理解你想用 1.x”。
~1.2 和 ~1.2.0 真的等价吗?要不要补 .0?
等价,Composer 会自动补 .0,但写全更安全、更可读:
-
~1.2→ 解析为~1.2.0→>=1.2.0 - 团队协作时,有人可能误读
~1.2为 “1.2.x 全放开”,而~1.2.0明确传递“从 1.2.0 开始”的意图 - CI/CD 流水线里,清晰的写法能减少人工 review 时的认知负担
尤其在金融、支付类模块中,少一个点可能多一次上线前核对。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
生产环境该用 ~ 还是 ^?关键看你要不要卡死次版本
如果你的中间件只在 2.7.x 上完整测试过,而 2.8.0 引入了未兼容变更:
-
^2.7.4会升到2.8.0(只要主版本没变) -
~2.7.4会稳在2.7.x区间,跳过2.7.5(已知 bug 版本),保留2.7.6、2.7.10等补丁 -
~2.7和~2.7.0行为一致,但后者更易被 CI 工具扫描识别为“显式锁定次版本”
别只盯着 composer.json ——真正生效的是 composer.lock 里记录的版本。一旦 lock 文件存在,composer install 就完全忽略 composer.json 中的 ~ 约束。
PHP 自身版本也能用 ~ 锁?要注意语义差异
可以,在 require 下写 "php": "~8.1" 是合法的,等价于 >=8.1.0 :
- 适合强依赖某个次版本特性的场景(比如某扩展仅适配
8.1.12的补丁行为) - 别写进
config.platform.php:那只是“假装”环境,不校验真实 PHP 版本 - 别写成
require-dev:它只约束 dev 包,对主运行环境无效
最容易被忽略的一点:写了 ~2.8 却没意识到它拒绝 2.9.0,直到某天发现新功能用不了才回头翻文档——这种事,多看一眼就能避开。










