Composer进阶使用之版本约束表达式的使用

关于这个问题之前是没有注意到的,在阅文面试的时候问到了,回来之后看了一下

可能有很多人和我一样,不是那么清楚各种写法到底是啥意思,比如波浪号~,折音号^

在了解约束表达式之前,先要了解一下语义化版本

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:主版本号:当你做了不兼容的 API 修改,次版本号:当你做了向下兼容的功能性新增,修订号:当你做了向下兼容的问题修正。先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸

版本约束

例如我们想要下载5.1版本的ThinkPHP包,我们可以通过composer.json文件:

{
    "require": {
    "topthink/framework": "5.1"
    }
}

然后运行install命令,或者通过require命令来加载扩展包

$ composer require topthink/framework:5.1
 
# 或者
$ composer require topthink/framework=5.1
 
# 或者
$ composer require topthink/framework 5.1

除过像上面这样指定具体的版本,我们还可以通过不同的约束方式去指定版本

使用波浪号~约束符锁定小版本

这种版本约束方式很实用,也是比较安全的,比如我们希望安装 >= 1.2并且< 2.0的版本时,根据语义化版本的定义,次版本号的变化是新增功能,所以包是稳定的,也就是可以安全更新的

你可以写成:~1.2

如果你希望次版本都不要更新,只允许修订版本(补丁版本)的变化,>= 1.1.15并且< 1.2.0

则写成:~1.1.15

所以,~的作用是允许表达式中最后一位变到最大值,~1.1 表示可以为 大于等于 1.1 的任何版本,比如 1.1.0、1.2.0、1.3.5 、1.99.9999、 1.9999.999999 都可以安装,但是不能安装 2.0.0, 同理,~1.1.2 表示 大于等于 1.1.2 的任何版本,比如 1.1.2、1.1.3、1.1.99、 1.1.9999 都可以安装

使用折音号^约束符锁定大版本

上面~表示最后一位可变,前面几位都不可变,那^的作用不一样的是:^锁定不允许变的第一位,其实用过正则的都知道code>^表示起始,^a表示以 a 开头的全部

它允许升级版本到安全的版本。例如,^1.2.3相当于>=1.2.3 <2.0.0,因为在2.0版本前的版本应该都没有兼容性的问题

而对于1.0之前的版本,这种约束方式也考虑到了安全问题,例如^0.3会被当作>=0.3.0 <0.4.0对待

所以,^1.2表示任意大于等于 1.2 的 1.x.x 版本,比如 1.2.0、1.2.1、1.3.0、1.9.99999 等。只要前面的 1 并且大于 ^ 后面指定的 1.2 都满足条件

锁定版本范围

使用比较操作符你可以指定包的范围。这些操作符包括:>>=<<=!=

你可以定义多个范围,使用空格 或者逗号,表示逻辑上的与,使用双竖线||表示逻辑上的或。其中与的优先级会大于或

这样的使用场景并不多,根据你的情况来调整就好

精确版本

可以指定具体的版本,告诉Composer只能安装这个版本。但是如果其他的依赖需要用到其他的版本,则包的安装或者更新最后会失败并终止

比如使用=1.2.34或者1.2.34都是指定了具体的版本号

以上是版本约束的介绍

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:Composer进阶使用之版本约束表达式的使用

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏中国白客联盟

基于splunk的主机日志整合并分析

大家都知道,主机日志格式过于杂乱对于日后的分析造成了不小的困扰,而splunk的轻便型、便携性、易安装性造就了其是一个日志分析的好帮手。

15220
来自专栏木子昭的博客

Markdown批量发布到Github

15430
来自专栏BeJavaGod

log4j的正确使用姿势

最近清明节,朋友公司的日志爆了,说控制台打得太满了,出了问题,早上4点多被喊去公司修改代码,他们把所有的日志全部在控制台打印了,结果就。。。我说日志这么做不可取...

34240
来自专栏BeJavaGod

权限设计(上) - 数据库表设计

web权限设计,做权限目前有三种主流实现方式 第一种:手动实现   配置2个拦截器,一个是拦截是否登陆,一个是拦截url的权限,通过角色权限表的配置,把权限ur...

51650
来自专栏IT笔记

Grafana+Prometheus打造全方位立体监控系统

前言 本文主要介绍如何使用Grafana和Prometheus以及node_exporter对Linux服务器性能进行监控。下面两张图分别是两台服务器: 服务器...

1K130
来自专栏张戈的专栏

shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

在 Linux 中,shell 脚本结合系统任务计划 crontab,非常简单就能实现一些复杂程序才能完成的工作,开发成本低,且简单易学。 张戈博客之前也分享过...

47090
来自专栏IT技术精选文摘

Nginx架构概述

传统的进程-或用于处理并发连接的基于线程的模型涉及使用单独的进程或线程处理每个连接,并在网络或输入/输出上进行阻塞操作。根据应用,在内存和CPU消耗方面可能非常...

58980
来自专栏别先生

使用shell脚本定时采集日志数据到hdfs分布式文件系统

72470
来自专栏赵俊的Java专栏

Hexo 优化 --- 支持邮件通知的评论 Valine 增强版

1K20
来自专栏Petrichor的专栏

文件层次结构

文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了Linux操作系统中的主要目录及目录内容。在大多数情况下,...

20540

扫码关注云+社区

领取腾讯云代金券