我升级到最新稳定后 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
<=version
1.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是任何东西