我升级到最新稳定后 node 和 npm, 我试过了 npm install moment --save。它保存了条目 package.json 随着 caret(^) 字首。以前,它是一个 tilde(~) 字首。
- 为什么要进行这些更改
npm? - 有什么区别
tilde(~)和caret(^)? - 有什么优势比其他人好?
我升级到最新稳定后 node 和 npm, 我试过了 npm install moment --save。它保存了条目 package.json 随着 caret(^) 字首。以前,它是一个 tilde(~) 字首。
npm? tilde(~) 和 caret(^)?用最简单的术语来说,代字号与最新的次要版本相匹配 (中间数字)。 ~1.2.3将匹配所有1.2.x版本,但会 错过1.3.0。
另一方面,插入符号更放松。它会更新你 最新的主要版本(第一个数字)。 ^ 1.2.3将匹配 任何1.x.x版本,包括1.3.0,但将在2.0.0推迟。
http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/
我想添加官方的npmjs文档,其中描述了版本特异性的所有方法,包括问题中提到的方法 -
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
~version “大致相当于版本”见 npm semver - Tilde Ranges & semver(7)^version “与版本兼容”请参阅 npm semver - Caret Ranges & semver(7)version 必须完全匹配版本>version 必须大于版本>=version 等等<version<=version1.2.x 1.2.0,1.2.1等,但不是1.3.0http://sometarballurl (这可能是将在本地下载和安装的tarball的URL* 匹配任何版本latest 获得最新版本以上列表并非详尽无遗。其他版本说明符包括GitHub网址和GitHub用户存储库,本地路径和包含特定npm标记的包
Npm允许安装比指定版本更新的软件包版本。使用代字号(~)给你bug修复版本和插入符号(^)为您提供向后兼容的新功能。
问题是旧版本通常不会收到很多bug修复,所以npm使用插入符号(^)作为默认值 --save。
根据: “Semver解释说 - 为什么我的package.json中有一个插入符号(^)?”。
注意 规则适用于1.0.0以上的版本,并非每个项目都遵循语义版本。对于版本0.x.x,插入符号仅允许 补丁 更新,即它的行为与波形符相同。看到 “Caret Ranges”
以下是概念的直观解释:
资源: “语义版本Cheatsheet”。
~ 修复主要和次要数字。当您准备接受依赖项中的错误修复时,可以使用它,但不希望任何可能不兼容的更改。
^ 仅修复主要数字。当您密切关注您的依赖关系时,它会被使用,并且如果次要版本不兼容,您可以快速更改代码。
在此之上, ^ 是 不支持 旧的npm版本,应谨慎使用。
所以, ^ 是一个很好的默认,但它并不完美。我建议您仔细挑选并配置对您最有用的semver运算符。
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3。^ (像头)。允许从左侧第二个非零级别更新: ^0.2.3 手段 0.2.3 <= v < 0.3。~ (像尾巴)。通常冻结最右边的级别或如果省略则设置为零:
~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。0.2 手段 0.2 <= v < 1。不同于 ~ 因为:
0设置启动主要级别并允许更新
* or "" (empty string) any version
1 v >= 1
冻结主要级别
~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
冻结小级别
^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
冻结补丁级别
~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)
禁止更新
1.2.3 1.2.3
^0.0.3 (0.0.3) 0.0.3
注意:缺少主要,次要,补丁或指定 beta 没有数字,是一样的 any 缺少级别。
注意:当你安装一个包有 0 作为主要级别,更新将只安装新的beta / pr级版本!那是因为 npm 套 ^ 默认情况下 package.json 当安装版本就像 0.1.3,它会冻结所有主要/次要/补丁级别。
~ :合理 关 至
~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
帽子匹配可能被认为是“破碎”,因为它不会更新 ^0.1.2 至 0.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.
^ 是1. [any]。[any](最新的小版本)
~ 是1.2。[任何](最新补丁)
很棒的阅读 这篇博文 关于semver如何适用于npm
他们正在做些什么使它匹配 semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0
一个班轮解释
标准版本控制系统是major.minor.build(例如2.4.1)
npm根据这些字符检查并修复特定包的版本
〜 :主要版本是固定的,次要版本是固定的,匹配任何版本号
例如:~2.4.1表示它将检查2.4.x,其中x是任何东西
^ :主要版本已修复,匹配任何次要版本,匹配任何内部版本号
例如:^ 2.4.1表示它将检查2.x.x,其中x是任何东西
〜蒂尔德:
~ 修复 主要和次要数字。^插入符号:
^ 仅修复主要数字。Tilde(〜)
主要版本是固定的,次要版本是固定的,匹配任何版本 数
"express": "~4.13.3"
~4.13.3 意味着它将检查4.13.x,其中x是任何东西,4.14.0
插入符号(^)
主要版本是固定的,匹配任何次要版本,匹配任何构建 数
"supertest": "^3.0.0"
^3.0.0 意味着它将检查3.x.x,其中x是任何东西