对npm包精准控制之npm-shrinkwrap.json与package-lock.json

npm-shrinkwrap.json

该文件是经过运行npm shrinkwrap命令产生的,在npm5以前(不包括5),主要是用来精准控制安装指定版本的npm包。具体啥意思?node

在开发一个项目的时候,特别是多人协做,或者在不一样设备中对同一个项目进行开发,可能会遇到这样的问题,A同事经过npm install安装了一些在某个版本下的npm包,过了一段日子,某个npm包内容功能更新了(更不幸的话还多是会破坏了本来一些功能的更新),B同事加入项目来了,他也须要在本身的设备上安装项目资源,结果是,在A同事这边功能正常的,但到B同事这边却异常了。这只是一种例子,还有更多相似的,相信不少开发者可能也会遇到过。git

那么致使这种状况发生的根本缘由是在于,同事间安装的npm包版本不一致,可能功能也就不一致。github

可能会有人疑问,那我在package.json中精确写死某个版本的npm包不就得了吗? 不!你漏了一个很重要的信息,这也是package.json作不到的,就是你要安装的这个npm包可能还须要依赖一些其余包,这些其余包的版本你也要控制好才能100%肯定一致npm

还有一个更加典型的例子,就是咱们在本地开发好的项目,一切正常,可是当须要在CI上进行打包发布后,发现有bug了!oh shit—— 心里不由感叹了一下。 缘由也是跟上面同样。json

那么如何避免这种状况的发生呢,就是要确保安装的npm包版本一致,这时候,就是npm-shrinkwrap.json的做用了,简单看一下长什么样子:post

这里边会记录你项目所依赖的npm包的一些信息,如版本号,资源地址,依赖项等,换句话说,就是记录你当前项目所造成的npm资源树。.net

那记录这些有什么用呢? 咱们安装npm包时,依据这些信息来安装对应信息的npm包,以达到每一个人安装的包是一致的目的。版本控制

注意code

  • 每次更新package.json或者node_modules时,如npm install新包,npm updatenpm uninstall等操做,为保持协做人的资源一致,仍是要手动运行npm shrinkwrap更新npm-shrinkwrap.json文件的。
  • 并且记得加入到版本控制中,否则就没意义了。
  • shrinkwrap计算时是根据当前依赖安装的目录结构生成的,若是你不能保证package.json文件定义的依赖与node_modules下已安装的依赖是匹配、无冗余的,建议在执行shrinkwrap命令前清理依赖并从新安装(rm -rf node_modules && npm install)或精简依赖(npm prune)。
  • 你们在查阅一些资料时,可能会看到以下描述:

默认状况下,shrinkwrap只计算dependencies依赖,而不计算dev-dependencies,若是在生产环境也须要开发依赖或你的依赖分类不清晰,使用--dev参数生成shrinkwrap文件确保不会出问题。cdn

后来我尝试过,就算不输入--dev,仍是能够把开发依赖生成到npm-shrinkwrap.json里,估计当时描述的做者当时背景下,npm这个设置的确是那样,只是到今天的迭代后,已经不正确了。

package-lock.json

在使用npm5后,你们可能都会发现,在项目里会存在一个文件——package-lock.json,打开一看,emmm~~ 这不就是npm-shrinkwrap.json嘛,的确,还真的一摸同样。

这是一个自动生成的文件,在咱们修改pacakge.json或者node_modules时就会自动产生或更新了。这个东西不只长得像npm-shrinkwrap.json,功能也跟它很像。

既然这样,为何要特地搞这么一个新的文件呢。虽然功能十分十分地类似,可是仍是存在一些区别

npm-shrinkwrap.json 与 package-lock.json的区别与联系

从npm版本看

package-lock.json是npm5的新特性,也不向前兼容,若是npm版本是4或如下,那仍是使用npm-shrinkwrap.json

从npm处理机制来看

  1. 在一个项目里,若是自己不存在这两个文件,那么在运行npm install时,会自动生成一个package-lock.json,或者在初始化一个项目npm init时,也会生成package-lock.json,安装信息会依据该文件进行,而不是单纯按照package.json,这两个文件的优先级都比package.json
  2. 若是项目两个文件都存在,那么安装的依赖是依据npm-shrinkwrap.json来的,而忽略package-lock.json
  3. 运行命令npm shrinkwrap后,若是项目里不存在package-lock.json,那么会新建一个npm-shrinkwrap.json文件,若是存在package-lock.json,那么会把package-lock.json重命名为npm-shrinkwrap.json

从文件更新来看

  1. npm-shrinkwrap.json只会在运行npm shrinkwrap才会建立/更新
  2. package-lock.json会在修改pacakge.json或者node_modules时就会自动产生或更新了。

从发布包来看

  1. package-lock.json不会在发布包中出现,就算出现了,也会遭到npm的无视。
  2. npm-shrinkwrap.json能够在发布包中出现

疑惑

好吧,我在查阅资料的时候,总有一个不懂的地方,总会看到这么一出描述

建议库做者发布包时不要包含npm-shrinkwrap.json,由于这会阻止最终用户控制传递依赖性更新。

说句实话的,其实我仍是不太懂,为啥不要发布呢,这样不就是恰好让发布出来的应用能保证不会因为依赖别人的包更新了而致使出错吗? 恳请大神赐教赐教

本文参考

github.com/npm/cli/blo… ithelp.ithome.com.tw/articles/10… juejin.im/post/594384… blog.csdn.net/ligang25851…

相关文章
相关标签/搜索