npm 版本号控制
版本运算符
版本运算符指定了一定范围的版本。 主要有**~、^、-、<、<=、>、>=、=**版本运算符。
~ 版本号 —– 指定主版本号或者次版本号相同
~ + 只含主版本 — 主版本相同; ~ + 含有次版本 — 主版本和次版本号相同。
| 版本范围 | 匹配版本 | 
|---|---|
| ~3 | 3.x 或者 3.0.0 <= v < 4.0.0 | 
| ~3.1 | 3.1.x 或者 3.1.0 <= v <3.2.0 | 
| ~3.1.2 | 3.1.2 < v < 3.2.0 | 
指定的版本范围含有预发布版本,只会匹配和完整版本号相同的预发布版本。 ~3.1.3-beta.2 匹配 3.1.3-beat.3 不匹配 3.1.4-beat-2
 |  | 
^ 版本号 — 第一个非零 版本号相同
| 版本范围 | 匹配版本 | 补充 | 
|---|---|---|
| ^3.1.5 | 3.1.5 <= v < 4.0.0 | |
| ^0.3.6 | 0.3.6 <= v < 0.4.0 | |
| ^0.0.2 | 0.0.2 <= v < 0.0.3 | |
| ^3.x.x | 3.0.0 <= v < 4.0.0 | 版本号缺少的位置,会被 0 填充 | 
| ^4.2.x | 4.2.0 <= v < 4.3.0 | 
npm 安装包时,默认使用 ^ 匹配版本。
安装主版本号为 3 的最新版本:
 |  | 
~ vs ^
| 版本范围 | 含义 | 匹配的版本 | 说明 | 
|---|---|---|---|
| ~3.3.0 | 与 3.3.0 相似 | 3.3.0 <= v < 3.4.0 | 主版本和次版本相同 | 
| ^3.3.0 | 与 3.3.0 兼容 | 3.3.0 <= v < 4 | 主版本相同 | 
同一个版本号,^ 能匹配的范围大些,更加激进。
例子
 |  | 
~ 和 ≈ 差不多,可将 ~ 理解成相似,这样就分辨和理解了,~指定的是相似版本。 ^ 可理解成兼容版本。
- 指定精确范围
| 版本范围 | 匹配版本 | 补充 | 
|---|---|---|
| 2.0.0 - 3.2.7 | 2.0.0 <= v <= 3.2.7 | - 前后有空格 | 
| 0.4 - 3 | 0.4.0 <= v <= 3.0.0 | 缺少的版本号,被 0 填充 | 
 |  | 
版本号比较器
| 版本范围 | 匹配版本 | 补充 | 
|---|---|---|
| <2.2.0 | 小于 2.2.0 的版本 | |
| <=2.0.0 | 小于等于 2.0.0 的版本 | |
| >4.2.0 | 大于 4.2.0 的版本 | |
| >=4.2.0 | 大于等于 4.2.0 的版本 | |
| =4.3.0 | 等于 4.3.0 的版本 | 
\ 是转义字符。
 |  | 
package-lock.json
在直接更新 package.json 和 package-loc.json 这两个文件后,npm install 是可以直接覆盖掉原先的版本的,所以在协作开发时,这两个文件如果有更新,你的开发环境应该 npm install 一下才对。
运行原理:
如果改了 package.json,且 package.json 和 lock 文件不同,那么执行npm i时 npm 会根据 package 中的版本号以及语义含义去下载最新的包,并更新至 lock。如果两者是同一状态,那么执行npm i都会根据 lock 下载,不会理会 package 实际包的版本是否有新。
npm-shrinkwrap.json
该文件是通过运行npm shrinkwrap命令产生的
npm-shrinkwrap.json 与 package-lock.json 的区别与联系
从 npm 版本看
package-lock.json 是 npm5 的新特性,也不向前兼容,如果 npm 版本是 4 或以下,那还是使用 npm-shrinkwrap.json 吧
从 npm 处理机制来看
- 在一个项目里,如果本身不存在这两个文件,那么在运行 npm install 时,会自动生成一个 package-lock.json,或者在初始化一个项目 npm init 时,也会生成 package-lock.json,安装信息会依据该文件进行,而不是单纯按照 package.json,这两个文件的优先级都比 package.json 高
 - 如果项目两个文件都存在,那么安装的依赖是依据 npm-shrinkwrap.json 来的,而忽略 package-lock.json
 - 运行命令 npm shrinkwrap 后,如果项目里不存在 package-lock.json,那么会新建一个 npm-shrinkwrap.json 文件,如果存在 package-lock.json,那么会把 package-lock.json 重命名为 npm-shrinkwrap.json
 
版本控制最佳实践
- package.json 包的更新策略不要太激进, 也不要太保守, 可以锁定前两位版本, 最后一位版本可变, 因为最后一位版本往往是修复 BUG
 - package-lock.json 应该加入版本仓库, 这样可以保证测试的依赖库和上线时候的依赖库一致
 
全局 node_modules 权限问题
first check who owns the directory
 |  | 
it is denying access because the node_module folder is owned by root
 |  | 
so this needs to be changed by changing root to your user but first run command below to check your current user How do I get the name of the active user via the command line in OS X?
 |  | 
OR
 |  | 
then change owner
 |  | 
OR
 |  | 
OR
 |  |