在我升级到最新的稳定的node和npm之后,我尝试了npm install moment --save。它保存package.json中带有插入符号^前缀的条目。以前,它是tilde ~前缀。
为什么在npm中进行这些更改?
tilde ~和caret ^有什么区别?
与其他人相比有什么优势?
- 仅供参考,您可以通过执行以下操作来防止前缀或使用自定义前缀:npm config set save-prefix=''。(如果你喜欢的话,就把~写在报价单上。)我个人就是这样做的,并且在生产中对产品进行收缩包装。
- 关于tilde和caret如何工作的所有细节和区别:github.com/npm/node semver tilde-ranges-123-12-1
- 这个工具是测试semver.npmjs.com的好帮手。
- @FNCOMP只是想澄清一下我对你的评论是否正确。您是否只在项目中使用依赖项的特定版本?我们的团队在升级依赖项方面犹豫不决。您是否建议对依赖项使用特定版本或"~"前缀..?
- @FNCOMP请你详细说明一下你的意思,"我亲自做这件事,在生产中做收缩包装"。谢谢!
- 我以前经常删除前缀,但使用收缩包装或包锁定并不真正必要。参见:docs.npmjs.com/files/package-locks
- NPM和节点中的语义版本化
The tilde ~ matches the most recent patch version (the third number) for the specified minor version (the second number).
~1.2.3 will match all 1.2.x versions but will hold off on 1.3.0.
The caret ^ is more relaxed. It matches
the most recent minor version (the second number) for the specified major version (the first number).
^1.2.3 will match
any 1.x.x release including 1.3.0, but will hold off on 2.0.0.
(这是http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/的修改和更正版本)
- 在这里发帖希望能抓住那些不太会思考这个问题的人,但是^和~,都假定您可以信任依赖关系中的次要和点发布。如果您正在发布库,并且希望其他人信任您,请不要盲目接受下游依赖项。从依赖关系中释放出一个坏的点会在上游引起连锁反应,当事情发展成梨形时,会有人敲你的门。这是在生产代码上使用NPM收缩包装的另一个重要原因。
- 你也可以用^或~来代替npm在你的版本之前的胡说八道。如果您想对您的版本进行严格控制,请设置此选项:npm config set save-prefix=''。
- 这对^是误导。它说^会将您更新到最新的主要版本,而实际上它会将您更新到最新的次要版本。即:-^1.2.3:=>=1.2.3<2.0.0-^0.2.3:=>=0.2.3<0.3.0-^0.0.3:=>=0.0.3<0.0.4
- @prasanthv是正确的:来自docs.npmjs.com/misc/semver caret-ranges-1-2-3-0-2-5-0-0-4:caret范围^1.2.3^0.2.5^0.0.4。允许不修改[major,minor,patch]元组中最左边非零数字的更改。换言之,这允许对1.0.0及以上版本进行补丁和次要更新,对0.x>=0.1.0版本进行补丁更新,对0.0.x版本不进行更新。
- @jgillich在semver中,当你使用0.2.x时,2不是major version。这就是docs.npmjs.com使用特定词语的原因:the left-most non-zero digit。另外,这个例子呢:^0.0.4意味着0.0.4
- 因为它不会将^0.1.2更新为0.2.0,所以帽匹配被破坏。规则是:始终将包的版本设置为跳过0.x.x版本范围,这样您将获得一致的行为。
- @Fagnerbrack:您提供的具体示例是正确的,但通常您的思维方式是错误的。例如:假设您将A打包成3个版本:0.0.1、0.0.2和0.0.3。0.0.1中有一个bug,所以您希望在您的包B中至少包含0.0.2。如果你写0.0.x,你会得到0.0.3,没关系。但是,如果其他包C同时要求B和A,并且另外限制"A":"<0.0.2",您将得到0.0.1,而不会显示任何冲突问题,这不是您想要的。使用tilde ~0.0.2有助于避免此问题。
- @对不起,我不明白。你是说0.0.x的行为与~0.0.0的行为不同,还是说0.x.0的行为与^0.0.0的行为不同?或者,您认为在您提供的上下文中,0.x.0/^0.0.0模式优于0.0.x/~0.0.0?
- @Fagnerbrack:我是说,当使用tilde时,您可以定义最小版本号(至少是最不重要的版本号)。使用0.0.x符号时,您没有这个选项,因为任何最不重要的版本号都是有效的。
- @Maciejsz现在我明白了,指定一个最低版本而不是最新的"x"确实是一个有效的用例。很有道理。尽管我建议不要使用"x"或"~"符号来确保多个开发人员之间的一致性。
- 您现在有*wich更新到最新的更新,无论版本如何。
- @haxpor或使用npm检查来自npm的更新。
- 值得注意的是,您可以使用NPMSEMVER计算特定包的版本范围。
- 奇怪的是,这个不正确的答案It will update you to the most recent major version有2千以上的赞成票。我想知道现在有多少人认为^更新了主要版本!!semserv版本控制中的major/minor/patch含义没有歧义-这是完全错误的。
- 插入到最新的小调,而不是大调。是Major、Minor、Patch、Hotfix。
- 在pre-5.xNPM中,符号(~/^影响npm install期间下载的依赖项。在5.x之后,在package.json旁边的package-lock.json的存在阻止了这一点。为了根据本文描述的规则更新项目依赖项,可以使用npm update(也可以更新package-lock.json),然后提交package.json和package-lock.json。
- 这是错误的。如前所述,^指定更新到次要版本和补丁(中间和最后一个编号),&;~指定只更新到补丁版本(最后一个编号)。"major"是语义版本控制中的第一个数字,指定中断更改,您不希望自动更新到该更改。从来没有见过这样一个明显错误的答案,在这里被投了这么高的赞成票。有点担心。
- 我已编辑此答案以更正解释。不要在评论中抱怨回答错误,下次请做点什么!
- 插入符号不会更新到最新的主要版本。只有次要版本和补丁版本。
- 这个答案是不可改变的,因为它是围绕着引用废话而形成的。PSPI的答案是正确的,应该投票表决。这个术语并没有多少误导性。这是胡说八道。如果你称狗为马,然后你说马吃肉,吠叫,你不是在说些误导性的话。
- 我们这里有个问题,伙计们…如果这是误导性的或不正确的,为什么会有2764张以上的选票?也许不要点击向上投票按钮,除非你百分之百地确定你要投票的是什么,这似乎是一个很好的实践。伊恩,把它放低一点…如果一个答案是错误的、误导的或令人困惑的…然后,它值得讨论,而不是用编辑链接跨越彼此的脚趾。
我还想添加官方的NPMJS文档,其中描述了版本特异性的所有方法,包括问题中提到的方法。-
https://docs.npmjs.com/files/package.json网站
https://docs.npmjs.com/misc/semver x-ranges-12x-1x-12-
- ~version大约等同于版本,见NPM Semver-Tilde系列和Semver(7)
- ^version与版本兼容参见NPM Semver-插入符号范围和Semver(7)
- version必须与版本完全匹配
- >version必须大于版本
- >=version等
- <=version
- 1.2.x1.2.0、1.2.1等,但不是1.3.0
- http://sometarballurl(这可能是一个tarball的URL,它将在本地下载和安装
- *匹配任何版本
- latest获得最新版本
上述清单并不详尽。其他版本说明符包括GitHub URL和GitHub用户报告、本地路径和带有特定NPM标记的包。
- 还可以指定精确的版本范围,如1.2.0 || >=1.2.2 <1.3.0:精确的1.2.0,或从1.2.2到1.3.0(包括1.2.0)的所有内容,但不能是1.2.1或1.3.1及以上版本,也不能是1.1.x及以下版本。
- @codemanx如果使用<,为什么包括1.3.0?
- 我的错,应该是读《江户记》1(22)。
- 1.x.x可能吗?
- @是的,是的。这将使所有版本大于等于1.0.0且小于2.0.0
- 更具体的链接形式是上面的->docs.npmjs.com/files/package.json依赖项
NPM允许安装比指定版本更新的包版本。使用tilde(~提供了错误修复版本,caret(^提供了向后兼容的新功能。
问题是旧版本通常不会收到那么多的错误修复,所以NPM使用Caret(^作为--save的默认值。
根据:"Semver解释了-为什么我的包中有一个插入符号(^)。json?".
注意,这些规则适用于1.0.0以上的版本,并不是每个项目都遵循语义版本控制。对于0.x.x版本,插入符号只允许补丁更新,即它的行为与tilde相同。参见"插入符号范围"
以下是对这些概念的直观解释:
来源:"语义版本控制作弊表"。
- ^0.2.5怎么样?从docs.npmjs.com/misc/semver caret-ranges-1-2-3-0-2-5-0-0-4:插入符号范围^1.2.3^0.2.5^0.0.4。允许不修改[major,minor,patch]元组中最左边非零数字的更改。换言之,这允许对1.0.0及以上版本进行补丁和次要更新,对0.x>=0.1.0版本进行补丁更新,对0.0.x版本不进行更新。
- @roprol 1.0.0之前的任何版本都被认为是不稳定的,这些规则不适用。
- 所以你的解释不完整
- @Roprol是的,有时候省略可读性是很好的,在包JSON中,依赖性低于1.0.0的可能性非常低。另见20/80原则,这是一条很好的规则,可以集中精力解决什么问题。
- 看看我的答案。你怎么认为?stackoverflow.com/questions/22343224/&hellip;
- @PSPI版本低于1.0.0"不太可能"?60人中,我们有15人,而且大多数人都不含糊。
- @戴维纽顿·奥奇…但是,即使版本高于1.0.0,也不能保证项目遵循semver。
- 这是一个严重的违约。除非下游的软件包能够保持足够的规则来不破坏东西,否则我总是希望得到我请求的确切版本。不是别的。
- @你的答案比这里的任何其他答案都清楚
~修正了大数和小数。当您准备接受依赖项中的错误修复,但不希望进行任何可能不兼容的更改时,可以使用它。
^只固定主编号。当您密切关注您的依赖关系,并且准备好在次要版本不兼容的情况下快速更改代码时,就会使用它。
除此之外,旧的NPM版本不支持^,应谨慎使用。
所以,^是一个很好的违约,但它并不完美。我建议仔细地选择和配置Semver操作符,它对您最有用。
- 不正确:插入符号范围^1.2.3 ^0.2.5 ^0.0.4。允许不修改[major,minor,patch]元组中最左边非零数字的更改。换言之,这允许对1.0.0及以上版本进行补丁和小更新,对0.x>=0.1.0版本进行补丁更新,对0.0.x.docs.npmjs.com/misc/semver caret-ranges-1-2-3-0-2-5-0-0-4版本不进行更新。
- 这个答案是完全错误的(这里还有很多其他答案)。这些都不能确定一个主要数字!正如@roprol所说,^只是保持最左边的非零数字不变。~另一方面,如果指定了次要版本(例如~1.2.3或~1.2),则只允许进行补丁更新;如果未指定次要版本(例如~1),则允许进行次要更新。
- @它们的意思是"fix"是"define"("fixate"),而不是"adjust",所以你们都同意如何处理主要数字。
semver
1
| <major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2 |
- 用ICM semver calculator为试验。(虽然"explanations为^(包括一切是更大的比的特定版本在相同的主要范围)和~(包括一切是更大的比的特定版本在相同的小范围)不在100%是的先生,calculator似乎工作的很好)
- alternatively,使用semver检查代替,这并不require T接你的包和explanations也提供。
允许或disallow变化
- 密码:1.2.3版本。
- 使用^(像头)。allows updates美元第二非零水平从左:^0.2.3意味着0.2.3 <= v < 0.3。
- 使用~(像尾)。一般的冻结,对现在或omitted:如果零水平集
- ~1意味着1.0.0 <= v < 2.0.0
- ~1.2意味着1.2.0 <= v < 1.3.0。
- ~1.2.4意味着1.2.4 <= v < 1.3.0。
- ommit现在正确的层次:0.2意味着0.2 <= v < 1。differs从~因为:
- 始omitted层次版也总是0
- 你可以设定开始主要版本没有specifying sublevels。
所有的(hopefully)possibilities
设定起始主要层次和允许updates向上 P / < >
1 2
| * or"(empty string) any version
1 v >= 1 |
冻结的主要层次 P / < >
1 2 3 4 5 6
| ~0 (0) 0.0 <= v < 1
0.2 0.2 <= v < 1 // Can't do that with ^ or ~
~1 (1, ^1) 1 <= v < 2
^1.2 1.2 <= v < 2
^1.2.3 1.2.3 <= v < 2
^1.2.3-beta.4 1.2.3-beta.4 <= v < 2 |
冻结的次要层次 P / < >
1 2 3 4 5
| ^0.0 (0.0) 0 <= v < 0.1
~0.2 0.2 <= v < 0.3
~1.2 1.2 <= v < 1.3
~0.2.3 (^0.2.3) 0.2.3 <= v < 0.3
~1.2.3 1.2.3 <= v < 1.3 |
冻结的补丁层次 P / < >
1 2 3
| ~1.2.3-beta.4 1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta 0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4 0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed) |
disallow updates P / < >
1 2
| 1.2.3 1.2.3
^0.0.3 (0.0.3) 0.0.3 |
注意:错过了主要的,次要的补丁,或specifying beta没有号码,也同样的年代any为错过了层次。 P / < >
注意:当你install的说明书,腹部0个主要层次,更新将只在installβ/ PR水平的版本。这是因为npm集J AS ^违约在package.json当installed版本也像0.1.3,它freezes所有主要/次要levels /补丁。 P / < >
- docs.npmjs.com https:/ / / / / misc semver
- docs.npmjs.com https:/ / / /文件/ package.json # dependencies
- 告诉人们不要从0开始项目,因为库和消费开发人员不了解系统是一个糟糕的解决方案。我认为@asdfasdfads有更好的信息。
- @proloser我只是认为系统应该简化,我们不应该使用0.x版本。
- 围绕早期生命周期开发和v0的用例非常有意义。了解v0的行为方式实际上让我期待着其他早期的生命周期项目。这意味着您可以拥有一个具有大量向后不兼容性的快速变化的API,而不必在实际情况下强制将项目声明为1.x(aka:stable)。
- 我明白,但我只是不喜欢它如何与塞姆弗和资格赛配合使用。
- 它更像是一种观点,不应该被当作一种普遍接受的方法。而^0.1.x可以得到完美的补丁。
- @但从NPM安装时,默认情况下不会获得^0.1.x。最有可能的是^0.1.3,它会阻止任何更新。不管怎样,我已经放弃了不使用0.*的建议,只是增加了通知。
- @Baj可以随意修改答案。
- @罗夫罗,我刚刚编辑了答案。
~:相当接近
1
| ~1.1.5: 1.1.0 <= accepted < 1.2.0 |
^兼容
1 2 3 4 5
| ^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 |
- 不是,不是吗?
- @Kytwb-编号。在第零个版本号的特殊情况下,克拉等于颚化符。因此,^0.1.3只接受0.1.x版本,不接受0.2.0版本,即使这只是一个小的增量。这种行为相当于~0.1.3。这种行为背后的原因是,第零个发布包仍然被认为是不稳定的;用semver.org的话说,4,"任何事情都可能在任何时候发生变化"(包括向后不兼容的变化)。
^是1.[any].[any](最新次要版本)
~是1.2.[任何](最新补丁)
这篇关于semver如何应用于npm的博文是一个很好的读物。他们所做的是使其符合Semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0
- 不正确:插入符号范围^1.2.3 ^0.2.5 ^0.0.4。允许不修改[major,minor,patch]元组中最左边非零数字的更改。换言之,这允许对1.0.0及以上版本进行补丁和小更新,对0.x>=0.1.0版本进行补丁更新,对0.0.x.docs.npmjs.com/misc/semver caret-ranges-1-2-3-0-2-5-0-0-4版本不进行更新。
六或可能被视为"破",因为它的更新到0.2.0^0.1.2韩元。当软件也使用新兴的0.x.y版本和六只会或比赛的最后varying数码(y)。这对在专用的。的原因是,在"软件也evolving API的变化rapidly:有一天你有这些方法和其他的一天你有那些方法和旧的ones离开的时候。如果你不想打破的代码为人民谁已经是使用你的图书馆,你去和increment的主要版本:如1.0.0- > 2.0.0- > 3.0.0。所以,通过时间的软件也终于做了100 %和全featured它会像11.0.0版本,这不能被看的很meaningful,但是看起来和confusing。如果你是,在另一方面,用0.1.x- > 0.2.x- > 0.3.x版本,然后通过时间的软件也终于做了100 %和全featured它也发布了2008版1.0.0和它意味着"这释放的一个长期的服务,你可以proceed和使用这个版本的图书馆在你的代码和在生产,uthor不会改变一切,明天,或者下个月,他不会被放弃的"包装"。 P / < >
的规则:当你的软件的使用0.x.yversioning hasn ',还matured和释放它与incrementing中间的数字的当你的公共API的变化(therefore人物具有^0.1.0不会得到0.2.0更新和它不会被打破他们的代码)。然后,当软件matures,释放它的社团,1.0.0和increment的leftmost数字的每一次你的公共API的变化(therefore人物具有^1.0.0不会得到2.0.0更新和它不会被打破他们的代码)。 P / < >
1 2 3 4 5
| 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. |
- 这个评论非常有帮助,似乎没有很好地记录下来。您有关于这种行为的文档链接吗?这个关于v0项目的答案帮助了我很多。
- 我没有链接:我也通过谷歌搜索和玩NPM语义版本计算器semver.npmjs.com找到了这些信息。
- 需要以更正式的方式添加到文档中。我在索尼公司给我的工程团队做了一个演讲,因为它似乎很容易被忽视。幻灯片.com/proloser/semver-v0
一个线性的解释
该系统是major.minor.build标准版本(例如2.4.1)
检查和很酷的新版本,基于这些特征,特别是包
~ : major version is fixed, minor version is fixed, matches any build number
例如:均值,它将为2.4.x 2.4.1检查是在X的是什么
^ : major version is fixed, matches any minor version, matches any build number
例如:均值,它将为2.x.x 2.4.1检查是在X的是什么
你可能已经看到在caret(~)和波浪线在package.json(^)。他们之间的差异是什么?
当你安装新的saves --保存,它的入口在package.json caret(^)前缀。
在波浪(~)
在简的波浪条件,在最近的比赛中(~)(中间的小版本号)。1.2.3将匹配所有1.2.x ~但威尔小姐1.3.0版本。
在caret(^)
在caret(^),在其他的手,是更多的轻松。它将更新你的最新的主要版本(第一号)。1.2.3将匹配任何1.x.x释为包括1.3.0,但将保持离线在线2.0.0。
参考:http:/ / / / caret medium.com @ hardy2151和波浪线在包装57f1cbbe347b JSON。
- 同样,这个答案是误导性的。Semver清楚地指出,正常版本号必须采用x.y.z格式[其中]x是主要版本,y是次要版本,z是补丁版本。
火柴的小波浪线~如果你要安装的版本,该软件包已经安装的版本1.4.2 1.4.3后和你,和你也是可用的如果1.4.4 package.json ~它是用来在你的项目,然后在新安装后会在你安装1.4.4升级项目。但是,有一个可用的软件包,然后那1.5.0)它将不被安装。这一个被称为小版本。
caret ^比赛专业版,如果你的项目中stalled 1.4.2封装也可为与当时是1.5.0将安装专业版。它将不允许,如果你有安装1.4.2 2.1.0平方公尺。
修正版,如果你不想改变每个版本的安装包,然后使用在线版的任何特殊性外固定(例如"在"
*最新版本安装最新的版本,如果你想只使用,然后在前面的包的名称。
- 这个答案有误导性。Semver清楚地指出,正常版本号必须采用x.y.z格式[其中]x是主要版本,y是次要版本,z是补丁版本。
波浪:~
- 很酷的~主次号码。
- 它是用于当你准备好接受一个在你的依赖。但我想incompatible任何潜在的变化。
- 在最近的比赛中的波浪线(中间的小版本号)。
- 将匹配所有1.2.x~1.2.3版本1.3.0小姐,但它会的。
- 波浪(~)你释放了错误修复
caret:^
- 主要^酷号只。
- 它是用于当你仔细看你的限制和快速的变化是准备你的代码将被释放,如果incompatible小调。
- 它将更新你的最新的主要版本(第一号)。
- 1.2.3将匹配任何1.x.x释为包括1.3.0,但它将保持离线在线2.0.0。
- caret(^)给你backwards兼容的新功能,以及。
- tilde与最新补丁版本(最后一个数字)匹配。插入符号与最新的次要版本(中间数字)匹配。
- @Abdullauf是对的。你的解释错了
波浪(~)
major version is fixed, minor version is fixed, matches any build
number
~4.13.3均值,它将检查是在X和4.14.0 4.13.x是什么
caret(^)
major version is fixed, matches any minor version, matches any build
number
它将检查是3.x.x ^3.0.0均值X是什么地方
- 你能详细说明这个答案与4年前发布的相同答案有什么不同吗?
该版本号是在每一个具有不同截面的designates语法意义。语法是由三段破碎到分隔点。
major.minor.patch1.0.2
主要和次要的补丁代表不同版本的软件包。
NPM使用波浪线(A)和caret(^)和次要版本的补丁designate这对使用的影响。
所以如果你看它~1.0.2 1.0.2版本的k-means或安装最新的补丁1.0.4版如。如果你看到它的均值为1.0.2 1.0.2版本安装最新的补丁或小或如1.1.0版本。
- 你能详细说明这个答案与4年前发布的相同答案有什么不同吗?
对~ specfices小调版发布专业版发布(指明)
例如,如果包是相同的版本,在线更新将安装最新版本的4.5.x~4.5.2(小版)将安装最新版本的4.x.x ^ 4.5.2(专业版)
- 你能详细说明这个答案与4年前发布的相同答案有什么不同吗?
从本质上来说,这不是一个答案,而是一个被忽视的观察。
克拉范围说明:
参见:https://github.com/npm/node semver caret-ranges-123-025-004
1
| Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. |
表示^10.2.3与10.2.3 <= v < 20.0.0匹配
我不认为这就是他们的意思。拉入11.x.x到19.x.x版本将破坏代码。
我想他们是指left most non-zero number field。semver中没有要求数字字段为单个数字的内容。