热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Composer的波浪线符号~和幂符号^到底有啥区别

下面由composer​教程栏目给大家介绍Composer的波浪线符号~和幂符号^的区别,希望对需要的朋友有所帮助!简单来说(我也就是搬运一下,上面提到的网站说的更清楚),三段式版本号各个段的含义是大版本.小版本.补丁版本。
下面由composer教程栏目给大家介绍Composer的波浪线符号~和幂符号^的区别,希望对需要的朋友有所帮助!

曾经见过太多乱写版本号的(其实现在比以前好很多了),好多 1.9.0 的下个版本必然是 2.0.0, 2.9.0 下个版本必须 3.0.0……主要还是因为之前对版本号的命名就没有规范,大家都是看心情写。后来 semantic versioning 得到推广,版本号取名的情况得到改善,但依然有很多人不知道三段式版本号是什么含义(各种培训学校你们教一下这些规范会死么……)。

简单来说(我也就是搬运一下,上面提到的网站说的更清楚),三段式版本号各个段的含义是:

大版本.小版本.补丁版本

先说最明显的补丁版本。如果你的软件或者库,之前有一些 bug 被修复了,此时补丁版本需要 +1。

再来说小版本号。如果你增加了新的功能,比如 RPG 游戏增加了自动拾取东西,或者你的代码库里增加了一个新的方法,用户升级了你的代码库也不会导致兼容问题(BC),那么小版本号 +1。

最后,如果你的软件完全重构了,或者你的代码库完全重构以至于用户升级了新的库必然导致兼容问题,那么大版本号 +1。

当然,还会有同时修改了 bug 并增加了功能的情况,总之如果前一位需要 +1,无论何种情况后面的位数都必须清零。

对于面向终端用户的软件,其实也用不着太严格,因为终端用户也不太关心版本(除了大版本号……,所以出现了 chrome 风格的版本号,火狐也跟着带坏……),但对于库文件作者,还是遵守版本号的好,因为你定的版本号,提供了很重要的信息给库调用者,他们需要通过你的版本号来判断是否要避免兼容性问题。

举个比较经典的例子,虽然 Symfony 2/3/4 用起来也都差不多,但是因为这三个版本之间已经出现接口不一致的情况,所以大版本号必须得 +1。如果你的库文件有接口改变导致不兼容之前版本,哪怕只有一个,也应该将大版本号 +1。

而如果你用 Symfony 3.0.x 开发了一些项目,即使直接升级到 3.4.x,理论上来说也是完全没有问题的。

说完三段式版本号,再来说说一个比较困扰 PHPer 的问题,到底 composer.json 里指定版本号的 ^ 符号和 ~ 符号到底是什么意思?有什么区别?

写这篇博客之前其实我在百度上搜了一下,想知道相关的文章是否很多,这篇文章还值得写否。搜索结果显示也的确有人总结过。虽然大都只有一个例子:

~1.2.3 代表 1.2.3 <= 版本号 <1.3.0

^1.2.3 代表 1.2.3 <= 版本号 <2.0.0

根据以上搬运内容,我再补充一点点,~表示版本号只能改变最末尾那段(如果是 ~x.y 末尾就是 y,如果是 ~x.y.z 末尾就是 z),比如这种情况:

~1.2 等于 >=1.2.0; <2.0.0

而 ^ 符号,就跟上面说了那么多的 semantic versioning 有关系了,它表示尽量使用最新版本,但保证不产生兼容问题,换句话说也就是除了大版本号以外,小版本号和补丁版本号都可以变。

但目前看来有一个很重要的细节大家都没说到,在 semantic versioning 里,0 开头的版本号是比较特殊的,而因为 ^ 严格遵守 semantic versioning 规则,所以会出现以下情况(早先的 composer 版本并没有这样的处理,后来修正了):

^0.3.0 等于 >=0.3.0; <0.4.0

咦?难道不应该是 <1.0.0 吗?

究其原因,semantic versioning 的规定是,大版本号以 0 开头表示这是一个非稳定版本(unstable),如果处于非稳定状态,小版本号是允许不向下兼容的!所以如果你要指定 0 开头的库那一定要注意:

~0.1 这种写法是很危险的,因为 ~0.1 等于 >=0.1.0; <1.0.0,可能出现无法向下兼容的情况,比较保险的写法还是

^0.1(等于 >=0.1.0; <0.2.0)

以上就是Composer的波浪线符号~和幂符号^到底有啥区别的详细内容,更多请关注其它相关文章!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
author-avatar
太2真人05
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有