该文件是经过运行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 update
, npm uninstall
等操做,为保持协做人的资源一致,仍是要手动运行npm shrinkwrap
更新npm-shrinkwrap.json
文件的。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这个设置的确是那样,只是到今天的迭代后,已经不正确了。
在使用npm5后,你们可能都会发现,在项目里会存在一个文件——package-lock.json
,打开一看,emmm~~ 这不就是npm-shrinkwrap.json
嘛,的确,还真的一摸同样。
这是一个自动生成的文件,在咱们修改pacakge.json或者node_modules时就会自动产生或更新了。这个东西不只长得像npm-shrinkwrap.json
,功能也跟它很像。
既然这样,为何要特地搞这么一个新的文件呢。虽然功能十分十分地类似,可是仍是存在一些区别
package-lock.json
是npm5的新特性,也不向前兼容,若是npm版本是4或如下,那仍是使用npm-shrinkwrap.json
吧
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
npm-shrinkwrap.json
只会在运行npm shrinkwrap
才会建立/更新package-lock.json
会在修改pacakge.json或者node_modules时就会自动产生或更新了。package-lock.json
不会在发布包中出现,就算出现了,也会遭到npm的无视。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…