composer install 只读 composer.lock,忽略 composer.json 中的波浪号约束;波浪号仅在 composer update 或首次 install 时生效,按 SemVer 解析为 >=1.2.3 <1.3.0 等范围。

composer install 从不看波浪号
它只读 composer.lock,完全忽略 composer.json 里写的 ~1.2.3 或任何其他约束。你改了 composer.json 的版本号但没跑 composer update?install 还是装 lock 文件里那个固定版本。
波浪号真正起作用的唯一时机
只有在运行 composer update(或首次没有 composer.lock 时的 install)才会解析 ~。此时 Composer 根据 SemVer 规则计算允许范围:
-
~1.2.3→ 等价于>=1.2.3 ,只放开 PATCH 位 -
~1.2和~1.2.0完全等价,都锁死 MINOR 为 2 -
~0.8.2→>=0.8.2 ,因为锚点落在第二位(8) -
~0.0.3→>=0.0.3 ,允许升到 <code>0.0.999
常见误操作:改完 ~ 就以为生效了
很多人把 "monolog/monolog": "~2.10" 改成 "~2.11",然后直接 composer install —— 结果什么都没变。原因很直接:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- lock 文件没更新,
install不会重新解析约束 - 如果本地有 lock,CI 构建也只会按 lock 装,和
json里的~毫无关系 - 删掉 lock 后再
install,才触发约束重算,但这时行为不可控(可能拉来意外版本)
0.x 包用 ~ 更要小心
~0.25.0 表面安全,实际风险不小:
- 很多 0.x 包根本不守 SemVer,
0.25.1可能悄悄破坏接口 - 如果你没看过 CHANGELOG 或 issue,
~0.25.0和^0.25.0一样危险 - 真想稳住,直接写
"spatie/laravel-ray": "0.25.0",或至少确认 minor 升级是否被作者明确定义为兼容
波浪号不是“自动选最新小版本”的懒人开关,它是带锚点的区间声明;而真正落地的,永远是 lock 文件里那个带哈希的精确版本。

















