package.json中的tilde(〜)和caret(^)有什么区别?

我已经升级到最新的稳定后nodenpm,我试过npm install moment --save它将条目保存在package.json带有脱^符号前缀的中。以前,它是一个波浪号~前缀。

  1. 为什么要进行这些更改npm
  2. tilde ~和caret有^什么区别
  3. 与其他相比有什么优势?
古一达蒙2020/03/13 16:03:09

与此问题相关,您可以查看有关版本的Composer文档,但简而言之:

  • 波形版本范围()-〜1.2.3等于> = 1.2.3 < 1.3.0
  • 脱字号版本范围(^)-〜1.2.3等于> = 1.2.3 < 2.0.0

因此,使用Tilde,您将获得补丁程序的自动更新,但次要和主要版本将不会更新。但是,如果使用Caret,则将获得补丁程序和次要版本,但不会获得主版本(重大更改)。

Tilde版本被认为是“更安全”的方法,但是,如果您使用可靠的依赖项(维护良好的库),则Caret版本不会有任何问题(因为较小的更改不应破坏更改)。

您可能应该查看有关stackosflow安装和composer更新之间的区别的stackoverflow帖子

乐米亚2020/03/13 16:03:09

〜专用于次要版本^指定主要版本

例如,如果软件包版本为4.5.2,则在更新〜4.5.2时将安装最新的4.5.x版本(MINOR VERSION)^ 4.5.2将安装最新的4.xx版本(MAJOR VERSION)

达蒙阳光乐2020/03/13 16:03:09

克拉 ^包括相同主要范围内比特定版本更大的所有物品。

代字号 ~在相同的次要范围内包含大于特定版本的所有内容。

例如,要指定可接受的最高版本范围为1.0.4,请使用以下语法:

  • 修补程序版本:1.0或1.0.x或〜1.0.4
  • 次要版本:1或1.x或^ 1.0.4
  • 主要版本:*或x

有关语义版本语法的更多信息,请参见npm semver计算器

已发布软件包中的npm语义版本

npm文档中的更多内容关于语义版本控制

JinJin2020/03/13 16:03:09

版本号采用的语法表示每个部分的含义不同。语法分为三部分,用点分隔。

major.minor.patch 1.0.2

主要,次要和补丁表示软件包的不同发行版。

npm使用代字号(〜)和脱字符号(^)分别指定要使用的补丁程序和次要版本。

因此,如果看到〜1.0.2,则意味着安装版本1.0.2或最新的修补程序版本(例如1.0.4)。如果看到^ 1.0.2,则表示安装版本1.0.2或最新的次要版本或修补程序版本(例如1.1.0)。

Davaid梅2020/03/13 16:03:09

提尔德(〜)

主要版本是固定的,次要版本是固定的,匹配任何内部版本号

"express": "~4.13.3" 

~4.13.3 表示它将检查4.13.x,其中x是任何东西,而4.14.0

脱字号(^)

主要版本是固定的,匹配任何次要版本,匹配任何内部版本号

"supertest": "^3.0.0"

^3.0.0 表示它将检查3.xx,其中x为任意值

猴子卡卡西2020/03/13 16:03:09

本质上,这不是一个答案,但似乎被忽略了。

克拉范围的说明:

参见:https : //github.com/npm/node-semver#caret-ranges-123-025-004

允许所做的更改不会修改[major,minor,patch]元组中最左边的非零数字。

意味着^10.2.3匹配10.2.3 <= v < 20.0.0

我认为那不是他们的意思。从11.xx到19.xx引入版本将破坏您的代码。

我认为他们的意思是left most non-zero number fieldSemVer中没有要求数字字段为一位的任何内容。

小宇宙老丝2020/03/13 16:03:09

semver分为3个主要部分,各部分用点分隔。

major.minor.patch
1.0.0

这些不同的主要,次要和补丁用于标识不同的发行版。浪潮(〜)和脱字号(^)用于标识在软件包版本控制中使用的次要版本和修补程序版本。

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1
神无Green前端2020/03/13 16:03:09

一班班轮说明

标准版本控制系统是major.minor.build(例如2.4.1)

npm根据这些字符检查并修复特定软件包的版本

:主要版本已固定,次要版本已固定,可匹配任何内部版本号

例如:〜2.4.1表示它将检查2.4.x,其中x为任意值

^:主要版本是固定的,匹配任何次要版本,匹配任何内部版本号

例如:^ 2.4.1表示它将检查2.xx,其中x为任意值

Sam神乐番长2020/03/13 16:03:09

帽子匹配可能会被认为“已损坏”,因为它不会更新^0.1.20.2.0当该软件出现时,使用0.x.y版本和帽子匹配将只匹配最后一个变化的数字(y)。这是有目的的。原因是,随着软件的发展,API迅速变化:有一天,您拥有了这些方法,而有一天,您拥有了这些方法,而旧的方法就不复存在了。如果您不想破坏已经在使用您的库的人的代码,则可以增加主要版本:例如1.0.0-> 2.0.0-> 3.0.0因此,等到您的软件最终100%完成并具有完整功能时,它就会像版本一样11.0.0,看起来似乎没有什么意义,实际上看起来很混乱。另一方面,如果您使用0.1.x->0.2.x-> 0.3.x版本,然后在软件最终100%完成并具有完整功能时将其发布为版本1.0.0,这表示“此版本是一项长期服务,您可以在生产中继续使用该版本的库代码,而作者不会在明天或下个月更改所有内容,也不会放弃该程序包”。

规则是:0.x.y在您的软件尚未成熟时使用版本控制,并在公共API更改时以中间数字递增的方式发布版本(因此人们^0.1.0不会获得0.2.0更新,也不会破坏其代码)。然后,当软件成熟时,1.0.0每次公共API更改时将其释放并在最左位递增(因此,人们^1.0.0将不会获得2.0.0更新,并且不会破坏其代码)。

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.
宝儿LEY理查德2020/03/13 16:03:09

您可能已经在package.json中看到了波浪号(〜)和插入号(^)。它们之间有什么区别?

当您执行npm install moment --save时,它将条目插入到带有packaget(^)前缀的package.json中。

代字号(〜)

用最简单的术语来说,代字号(〜)匹配最新的次要版本(中间数字)。〜1.2.3将与所有1.2.x版本匹配,但会错过1.3.0。

尖号(^)

另一方面,插入符号(^)更宽松。它将把您更新到最新的主要版本(第一个数字)。^ 1.2.3将与任何1.xx版本(包括1.3.0)匹配,但将在2.0.0版本上生效。

参考:https : //medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b

猴子飞云2020/03/13 16:03:09

Tilde〜匹配次要版本,如果您安装了具有1.4.2的软件包,并且在安装后,如果在package.json中将其用作〜1.4.2,则还可以使用版本1.4.3和1.4.4,然后npm install在升级后的项目中将在项目中安装1.4.4。但是该软件包有1.5.0可用,因此〜不会安装。它称为次要版本。

插入符^匹配主要版本,如果在项目中安装了1.4.2软件包,并且在发布1.5.0版本之后,则^将安装主要版本。如果您具有^ 1.4.2,则将不允许安装2.1.0

固定版本,如果您不想在每次安装时都更改软件包的版本,则使用不带任何特殊字符的固定版本,例如“ 1.4.2”

最新版本*如果要安装最新版本,请仅在软件包名称前使用*。

Near神无Pro2020/03/13 16:03:09

〜蒂尔德:

  • ~冻结主要和次要数字。
  • 当您准备接受依赖项中的错误修复但不希望任何潜在的不兼容更改时,可以使用它。
  • 代字号与最新的次要版本(中间编号)匹配
  • 〜1.2.3将与所有1.2.x版本匹配,但将错过1.3.0。
  • Tilde(〜)为您提供错误修复版本

^脱字号:

  • ^ 仅冻结主号码。
  • 当您密切关注依赖关系并准备好快速更改代码时(如果次要版本不兼容),可以使用它。
  • 它将把您更新到最新的主要版本(第一个数字)。
  • ^ 1.2.3将与任何1.xx版本(包括1.3.0)匹配,但将在2.0.0版本上生效。
  • 脱字号(^)也为您提供了向后兼容的新功能。
Davaid阳光小卤蛋2020/03/13 16:03:09

~:合理接近

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^兼容

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0
2020/03/13 16:03:09

^是1. [any]。[any](最新的次要版本)
~是1.2。[any](最新的补丁)

一个伟大的读取是这个博客帖子上semver如何适用于NPM
和他们在做什么,使之匹配的semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0

→笑里藏刀↓2020/03/13 16:03:09

npm允许安装比指定版本更新的软件包。使用代字号(~)可提供错误修复版本,而插入符号(^)也可提供向后兼容的新功能。

问题是旧版本通常不会收到太多的错误修复,因此npm使用caret(^)作为默认值--save

semver表

根据:“ Semver解释了-为什么我的package.json中有插入符号(^)?”

请注意,规则适用于1.0.0以上的版本,并非每个项目都遵循语义版本。对于版本0.xx,插入记号仅允许更新补丁,即,其行为与代字号相同。请参阅“范围”

这是概念的直观说明:

semver图

来源:“语义版本备忘单”

十三Tony伽罗2020/03/13 16:03:09

~修正主要和次要数字。当您准备接受依赖项中的错误修复但不希望任何潜在的不兼容更改时,可以使用它。

^仅固定主号码。当您密切关注依赖关系并准备好快速更改代码时(如果次要版本不兼容),可以使用它。

除此之外,^不支持由旧版本的NPM,并应谨慎使用。

因此,这^是一个很好的默认值,但不是完美的。我建议仔细选择和配置对您最有用的semver运算符。

逆天2020/03/13 16:03:09

See the NPM docs and semver docs

~version “Approximately equivalent to version”, will update you to all future patch versions, without incrementing the minor version. ~1.2.3 will use releases from 1.2.3 to <1.3.0.

^version “Compatible with version”, will update you to all future minor/patch versions, without incrementing the major version. ^2.3.4 will use releases from 2.3.4 to <3.0.0.

See Comments below.

Harry神乐2020/03/13 16:03:09

我还想添加官方的npmjs文档,其中描述了所有针对版本特定性的方法,包括问题中提到的方法-

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version“大约等同于版本”,请参见npm semver-Tilde Rangessemver(7)
  • ^version“与版本兼容”请参阅npm semver-插入符号范围semver(7)
  • version 必须完全匹配版本
  • >version 必须大于版本
  • >=version 等等
  • <version
  • <=version
  • 1.2.x 1.2.0、1.2.1等,但不是1.3.0
  • http://sometarballurl (这可能是将在本地下载并安装的tarball的URL
  • * 匹配任何版本
  • latest 获取最新版本

上面的列表并不详尽。其他版本说明符包括GitHub网址和GitHub用户仓库,本地路径以及带有特定npm标签的软件包