^允许主版本不变下的次版本和补丁更新,~则更保守,通常仅限补丁更新;二者选择需权衡稳定性与功能更新,配合composer.lock和测试确保兼容性。

在Composer的世界里,版本约束符
^
~
^
~
要深入理解
^
~
^
composer.json
^1.2.3
>=1.2.3 <2.0.0
1.3.0
1.2.4
1.9.9
2.0.0
^1.2.3
2.0.0
这个符号的哲学是:如果一个库的维护者遵循SemVer,那么在同一个主版本号下,次版本更新不应该引入破坏性变更。所以,使用
^
~
~
~1.2.3
>=1.2.3 <1.3.0
1.2.4
1.3.0
~
~1.2
>=1.2.0 <2.0.0
^1.2.0
~1.2.0
~
总结一下:
^X.Y.Z
X.Y.Z
X.(Y+n).Z
(X+1).0.0
~X.Y.Z
X.Y.Z
X.Y.(Z+n)
X.(Y+1).0
~X.Y
^X.Y.0
X.Y.0
X.(Y+n).Z
(X+1).0.0
{
"require": {
"monolog/monolog": "^2.0", // 允许 2.x.x 版本,但不允许 3.x.x
"symfony/console": "~5.4.0" // 允许 5.4.x 版本,但不允许 5.5.0
}
}^
嗯,说起来,大多数现代PHP项目,我个人倾向于在非核心且遵循语义化版本规范的依赖上使用
^
具体来说,当你依赖的包:
^
^
^
composer.json
1.2.3
^
当然,这不意味着你可以完全放任不管。即使使用了
^
composer update
~
如果说
^
~
~
我通常会在以下几种情况考虑使用
~
~1.2.3
~
~
1.3.0
1.2.x
~1.2.0
~1.2.3
使用
~
版本约束,这东西,用好了是利器,用不好就是定时炸弹。要避免兼容性问题,我觉得有几个核心点需要我们始终牢记:
理解并利用composer.lock
composer.lock
composer.json
^
~
composer.lock
composer.lock
composer.lock
composer.lock
composer.json
拥抱自动化测试: 任何依赖更新,无论大小,都应该伴随着全面的自动化测试。单元测试、集成测试、端到端测试,它们是你的安全网。当运行
composer update
定期审查和更新依赖: 不要等到项目快崩了才想起更新依赖。将依赖更新纳入你的日常维护流程。可以使用
composer outdated
精确锁定关键依赖: 对于那些你真的不想让它自动更新的、极度敏感的依赖,可以直接在
composer.json
"monolog/monolog": "2.9.1"
构建隔离环境: 在本地开发环境、测试环境和生产环境之间,尽量保持依赖的一致性。这意味着在所有这些环境都应该使用同一个
composer.lock
composer install
理解和尊重语义化版本(SemVer): 作为开发者,我们应该尽量为自己的库遵循SemVer。作为使用者,我们应该理解它的含义。当一个库声称遵循SemVer时,我们通常可以信任
^
~
总的来说,版本约束的选择只是第一步,后续的
composer.lock
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号