12月06, 2016

npm模块版本管理

通过npm install xx -S,往往生成的package.json,这样的,例如:

"dependencies": {
    "antd": "^2.5.0"
  }

简单地说,我当前的node_modules下面安装的antd版本为2.5.0,但是当antd出了2.5.1的版本,那么一旦其他同事把这个项目克隆过去,他通过npm install下载,最终antd版本为2.5.1。

有确保的第三方组件倒是还好,要是没确保,或者被依赖必须要指定版本号,那就坑大了。

所以我们要想一个解决的方案。

  • 方案一:通过npm install xx@x.y.z,安装固定版本。

这里有一个事不得不提,当我们npm i了之后,我们发现有某个模块版本有更新,然后在控制台重新npm i,但最终得不到我们想要的结果。

这是因为:

安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。

注意:,这个方案并不可行,通过npm install xx@x.y.z -S,在package.json还是会带上“^”,可以写成这样npm i xx@x.y.z --save --save-exact,这样package.json里面的版本就固定了。

当然我们也可以通过全局设置npm的安装都是固定版本,可这样的方式并不太好:

npm config set save-exact true
  • 方案二:通过yarn,它会生成lock文件

新的 js 包管理工具 yarn 解决了什么问题?

也许在尝试用yarn的过程中,会有一些问题,但个人觉得这个方案确实是可以尝试的。

  • 方案三:npm shrinkwrap

在第一次运行(npm shrinkwrap)时的顺序:(不然容易报错)

npm prune
npm i
npm shrinkwrap

注意: 如果 node_modules 下存在某个模块(如直接通过 npm install xxx 安装的)而 package.json 中没有,运行 npm shrinkwrap 则会报错。另外,npm shrinkwrap 只会生成 dependencies 的依赖,不会生成 devDependencies 的。

在开发过程中,引入一个新包的流程如下:

  1. npm install PACKAGE_NAME@VERSION --save 获取特定版本的包
  2. 测试功能
  3. 测试功能正常后,执行 npm shrinkwrap 把依赖写入 shrinkwrap 文件
  4. 在代码仓库中提交 shrinkwrap / package.json 描述

升级一个包的流程应该是这样:

  1. npm outdated 获取项目所有依赖的更新信息
  2. npm install PACKAGE_NAME@VERSION --save 获取特定版本的包
  3. 测试功能
  4. 测试功能正常后,执行 npm shrinkwrap 把依赖写入 shrinkwrap 文件
  5. 在代码仓库中提交 shrinkwrap / package.json 描述

删除一个包的流程如下:

  1. npm uninstall PACKAGE_NAME --save 删除这个包
  2. 测试功能
  3. 测试功能正常后,执行 npm shrinkwrap 把更新的依赖写入 shrinkwrap 文件
  4. 在代码仓库中提交 shrinkwrap / package.json 描述

参见:使用 npm shrinkwrap 来管理项目依赖

本文链接:www.my-fe.pub/post/npm-module-manage.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。