package.json bower.json等配置中dependences版本范围的表达方式

在node的modules和bower的components中,我们会先通过package.json或bower.json来配置一个dependences字段选项,当我们执行npm installbower install时,这个字段中所依赖的包会被下载下来放到对应的目录中。那么这个字段中配置的包版本具体是怎样配置呢?

确定的版本号

当我们需要一个确定的版本号的时候,直接传入这个版本号的具体值,例如:

"dependencies": {
  "jquery" : "1.12.4"
},

这个时候,jquery的值是具体的,确定的,执行npm install的时候,这个版本的jquery会被下载到node_modules目录中。

注:为什么需要一个版本号呢?直接下载最新版的不就可以了吗?实际上在我们下载的所有包中,不同的包所依赖的包不一样,比如你写的一个组件依赖1.x版本的jquery,而另外一个人写的组件依赖2.x版本的jQuery,这就需要在自己的包中明确自己的jQuery版本号,在执行npm install时,显示提示信息,让执行者选择最终要安装哪个版本。

选择一定范围的版本号

就像上面注释中指出的,如果存在两个组件依赖版本不同的时候,就需要作出一个妥协,让双方可以兼容。其中的一种方法就是提供一个可选择的范围的版本号,比如,你在你的配置文件中这样写:

"dependencies": {
  "jquery" : ">=1.12.4"
},

我们使用了>=号,也就是说,大于等于1.12.4的所有版本都可以支持你写的组件。选择范围可以使用:

>
>=
<
<=

没有=哦,如果要=,直接填写具体的版本号就可以了。

兼容同一个大版本的不同小版本

如果你打算让你的组件运行在IE8等浏览器,就不能使用2.x版本的jQuery,所以你要作出规定。

"dependencies": {
  "jquery" : "^1.12.4"
},

它的意思是兼容所有1.x版本的jQuery(但必须是>=1.12.4版本)。

在进行下文的阐述之前,我们先做一个约定,我们把一个版本号进行分解:

[major version].[release version].[develop version]

上面是我们约定的把一个版本号的三部分分开称呼的方式。下文中我们会用major, release, develop简称这三个位置上的数字代表的版本号。

这些兼容性质的版本号表示方式包括:

"~1.2.0" :使用~的意思是“约等于”这个版本,说的具体点,就是“>=1.2.0 && <1.3.0”版本。~会在develop version这个版本号上向上兼容,所以使用~,相当于向上兼容同一个release version.

"^1.12.0" :和~有点像,但是使用^的意思是“兼容”这个版本的意思,就是">=1.12.0 && <2.0.0"版本。^会在release version版本号上向上兼容,也就是说向上兼容同一个major version.

"1.1.x" :它的作用有点像~,但是它并不要求向上兼容,意思是">=1.1.0 && <1.2.0",吃通整个release version。

"1.x":同样的道理,它的作用类似^,但是吃通整个major version,也就是">=1.0.0 && < 2.0.0".

上面的解释基本说清了~, ^, x的作用,但是有一个细节需要注意,就是当一个包出于开发状态,还没有major version的时候,^的作用向下降一级,相当于和~作用一样,比如:

^0.2.3 相当于 ~0.2.3 也就是 >=0.2.3 && < 0.3.0

任何版本都可以

下面的这个方法是不对任何版本有要求:

"dependencies": {
  "jquery" : "*"
},

为什么可以允许任何版本呢?有两个原因:1.你的组件对版本没有任何要求;2.其他组件有版本要求,你希望最大程度的兼容它。

最新版本

你希望你所依赖的这个包永远处于最新的版本,可以使用:

"dependencies": {
  "jquery" : "lastest"
},

这种情况下,执行npm install的时候,会下载最新版本的jquery,但是很有可能与其他组件的依赖产生冲突。

通过URL确定版本

如果你不知道这个包属于什么版本,或者你希望下载这个包的时候,通过给定的URL去下载对应的版本,可以如下:

"dependencies": {
  "jquery" : "https://yourdomain.com/jquery.git"
},

这种使用方法很少出现,一般在npm中都不会使用,在bower中才偶尔用到。

2016-07-19