.gitignore到底要不要写上package-lock.json


Administrator
RR 发布于 2025-01-13 / 17 阅读 / 0 评论 /
原文地址:https://juejin.cn/post/6844904166289047565 先说结论:.gitignore里不要写package-lock.json。 npm官方文档里明确说明: This file is intended to be committed into source

原文地址:https://juejin.cn/post/6844904166289047565

先说结论:.gitignore里不要写package-lock.json。

npm官方文档里明确说明:

This file is intended to be committed into source repositories, and serves various purposes:

这个文件(指package-lock.json),被设计出来就是要提交到源码库,原因如下

  • Describe a single representation of a dependency tree such that teammates, deployments, and continuous integration are guaranteed to install exactly the same dependencies.

  • Provide a facility for users to “time-travel” to previous states of node_modules without having to commit the directory itself.

  • To facilitate greater visibility of tree changes through readable source control diffs.

  • And optimize the installation process by allowing npm to skip repeated metadata resolutions for previously-installed packages.

(懒得翻译了)

下面说人话

今天上线,本地测试完全ok,上线之后部署总是出bug。

经过一番痛苦的排查,发现:一个npm包自动升级了,导致与别的包,或者与部署环境不兼容,导致报错,或者bug。

临时解决方案:锁定版本,也就是将 "^1.0.0" 写成 "1.0.0",重新部署,暂时搞定!

下来思考,相避免这种问题,如果把package.json里所有的包都锁定版本,行吗?不行。why?

因为npm包的依赖关系是树状的,手动能锁定的只有package.json里的第一层包的版本,每个包往下还有数不清的依赖分支,每个依赖中都有自己独立的package.json,这些你没办法都手动锁定版本,它们升级的话,一样会造成同样的问题。

package-lock.json 的出现就是为了解决上面的问题,对整个依赖树进行版本锁定 。 这个方案大概是在npm 5之后出现的。

所以你既然选择锁定版本,那package-lock.json一定要在源码库里。

换个角度

那假如说你完全不需要锁定版本这个功能,那你可以在.npmrc文件中写一句package-lock=false来关掉它。这样package-lock.json压根就不会生成。但你要明确的知道你为什么不需要它。

之前听到一个有趣的说法,也有一定道理。讲的是,一定不要锁定版本。因为任何npm包都有潜在的bug,你锁定了版本等于永远有一个地雷在包里,就算它已经被开发者修复升级了,由于你锁定了版本,那个地雷还是存在,指不定哪天就被你踩到。

所以锁版本不锁版本都没错,只要你理解了其中原理,自然会根据实际情况去做出好的选择。

以及知乎也有类似问题,行业大佬的回答,具体如下图





是否对你有帮助?

评论