package-lock.json 需要写进 .gitignore 吗?

众所周知,npm 借鉴 yarn 在 v5 推出 package-lock.json 文件。 笔者经过了解发现: 在 jquery 项目中,packa…
关注者
271
被浏览
283,391

13 个回答

先给出回答:

package-lock.json 不应写进 .gitignore。 这点无论你是否使用 lock 都是一样的。


具体来说:

如果你使用 lock 机制,则应该将 package-lock.json 提交到 repo 中。比如 Vue 采取了该策略。

如果你不使用 lock 机制,则应该加入 .npmrc 文件,内容为 package-lock=false ,并提交到 repo 中。比如 ESLint 采取了该策略。


例外是,如果你使用 yarn 并且不打算使用 npm,则可以把 package-lock.json 列入 .gitignore(比如 Babel);反之如果你使用 npm 并且不打算使用 yarn,则可以把 yarn.lock 列入 .gitignore (比如 TypeScript)。


如果你不按照上述方式做,请确定你清楚自己在干什么。比如 jQuery 为什么把 package-lock.json 写入 .gitignore 可以看其 commit message: Build: Remove package-lock.json, add it to .gitignore · jquery/jquery@7037fac 。简单说就是 optional 依赖包会导致不同平台上的 package-lock.json 发生变更。jQuery 的人认为这有问题,所以暂时性 ignore 了它。先不管是不是有更好的方式或者其他 workaround,最新的 npm 5.6.0 其实已经解决了这个问题。(想混个 jQuery contributor 的同学可以赶紧去提交 PR 了,成功之后可以给我发个红包当谢礼。)

有一些不使用 lock 机制的库,已经使用了 .npmrc ,但也把 package-lock.json 列入了 .gitignore,这是没有必要的。


至于到底要不要 lock,是另一个话题了。尽管题主也许想问的实际上就是要不要 lock,不过我还是按照题面作答。如果想讨论要不要 lock,建议移步已有的 透过 js-beautify@1.7.0 的 Bug 来看,npm 默认的 lock 机制是否重要? 问题。

更新于 2020.07.24

有赞急招 前端 java 测试开发,有兴趣的可以加微信私聊~ wsldd225

-----------
我来说说不一样的点。

npm 5.x 发布以来到现在的5.6.0 lock的作用变更过好多次,现在网上很多小白文都是停留在以前的文档翻译。



从npm3.x更新到了npm5,但是发现执行 `npm i ` 时的现象跟网络上的科普文不太一致。



有提到不管怎么修改package.json文件,重复执行npm i,npm都会根据lock文件描述的版本信息进行下载。



也有提到重复npm i时,npm会不顾lock的信息,根据package.json中的包Semantic versioning 版本信息下载更新模块(lock貌似没啥用了)。



**查阅资料得知,自npm 5.0版本发布以来,npm i的规则发生了三次变化。**



1、npm 5.0.x 版本,不管package.json怎么变,npm i 时都会根据lock文件下载



package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm

这个 issue 控诉了这个问题,明明手动改了package.json,为啥不给我升级包!然后就导致了5.1.0的问题...



2、5.1.0版本后 npm install 会无视lock文件 去下载最新的npm



然后有人提了这个issue why is package-lock being ignored? · Issue #17979 · npm/npm

控诉这个问题,最后演变成5.4.2版本后的规则。



3、5.4.2版本后 why is package-lock being ignored? · Issue #17979 · npm/npm





大致意思是,如果改了package.json,且package.json和lock文件不同,那么执行`npm i`时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。



如果两者是同一状态,那么执行`npm i `都会根据lock下载,不会理会package实际包的版本是否有新。