为何要使用 package-lock.json

做者:Kostas Bariotis

翻译:疯狂的技术宅前端

原文:https://blog.logrocket.com/wh...git

未经容许严禁转载程序员

在本文中,咱们将介绍 package-lock.json 为何重要,以及如何与 NPM CLI 一块儿使用。github

历史

NPM v5 引入了 package-lock.json, 将其做为捕获在任意时刻安装的确切依赖树的机制。面试

这会有助于在不一样环境中进行协做,在这种环境中,你但愿每一个人都为项目的特定版本获取依赖项以获得同一棵依赖树。express

package.json 使用语义版本定义所需的依赖项及其各自的版本。可是语义版本控制可能很棘手。npm

考虑一个表示为 "express": "^4.16.4" 的依赖项。json

该模块的发布者(不使用 package-lock.json )将安装版本为 4.16.4 的 Express ,由于他们安装了最新版本。segmentfault

若是 express 在我下载该模块并尝试安装依赖项时发布了新版本,则能够下载最新版本。bash

这些信息 caret 符号能够准确地告诉咱们

上面的问题是,若是 4.17.x 版本存在一个错误,则个人本地设置将会失败,可是发布商的版本将继续在旧版本上正常运行。

在生产环境中可能会发生一样的事情,而且你不知道为何它会失败。

在 NPM v5 以前,你须要使用 shrinkwrap。它与 package-lock.json 不一样,由于它能够与模块一块儿发布到 NPM 注册表中,而 package-lock.json 则不容许。

若是全部成员均可以使用 NPM+5,则最好对未发布的项目使用 package-lock.json

可是,若是你正在开发模块并打算发布它,则须要考虑是否要让客户端安装你指定的确切依赖关系树,或者是否但愿灵活一些。 这里是该主题的更详细的版本

所以, package-lock.json 将描述当前安装的确切依赖树。该格式在NPM文档中进行了描述。

经过将其提交到你的 VCS(绝对应该这样作),能够返回历史记录并复制确切的依赖关系树。

确保始终向你的 VCS 提交 package-lock.json,以在任何给定时间跟踪确切的依赖树。

它将确保下载你项目并尝试安装依赖项的全部客户端都可以得到彻底相同的依赖树。此外这也确保你可以检出先前的提交并复制每一个提交的依赖状态。

package.jsonpackage-lock.json

要确保你不去直接更改 package-lock.json。这将由 NPM 自动处理。它将对 package.json 的更改反映到package-lock.json,并保持最新。

可是只有在使用 NPM 的 CLI 进行更改时,才会发生这种状况。若是你手动更改 package.json,则不要指望 package-lock.json 会更新。要始终使用 CLI 命令,例如 installuninstall 等。

如何使用NPM CLI

当你首次在新项目中使用 NPM 时,它会自动生成 package-lock.json

而后,你就能够正常使用 NPM 了。

npm install(使用特定模块做为参数)

能够将 install 与要安装的模块名一块儿使用,这将更改 package.jsonpackage-lock.json,由于依赖关系树将会发生变化。

考虑下面的例子:

npm install express body-parser cors

npm install(不带参数)

install 将尝试安装与 package-lock.json 相关的全部依赖项。

这里的关键是,若是 install 注册已通过期,则能够更改 package-lock.json

若是有人手动更改 package.json(例如,他们删除了一个软件包,由于这只是删掉一行),那么下次有人运行 npm install 时,它将更改 package-lock.json 以反映对先前软件包的删除。

这可能很棘手。想象一下,拉取项目的最新版本,当运行 npm install 获取最新信息时,却发现树中进行了许多毫无心义的更改。

你树中的更改极可能对审核你的代码更改的人没有意义。

npm uninstall

install 相似,但须要用要被删除的模块名称做为参数。这将同时更改 package.jsonpackage-lock.json

npm update

update 将会读取 package.json,用来查找能够更新的全部依赖项。随后它将构造一个新的依赖关系树并更新 package-lock.json

还记得语义版本控制吗?假设咱们在 package.json 中有一个依赖项,状态为 ^1.4.5

字符 ^ 告诉 NPM 检查在 1.X.X 范围内是否有较新版本,若是有,则进行安装。相似地,字符只会出如今热修复程序或 1.4.X 上。

你也能够省略特殊字符并保留固定版本,这会减小 package-lock.json 的帮助(但并不是没有用)。

npm ci

ci 将安装与 package-lock.json 有关的全部依赖项,相似于 install。这里的主要区别在于,在任何状况下都不会更改 package-lock.json

其目的是要在某些环境中使用,例如构建服务器时以自动方式进行安装等。

结论

使用 package-lock.json 时,请记住如下关键要点:

不要在没有参数的状况下使用 npm install 来获取依赖关系,因此请使用 npm ci。你能够用 npm install 安装特定的依赖项。

仅在须要本地依赖关系树时,甚至在本地开发环境中,均可以在全部地方使用 npm ci

为你依赖关系的更新作一个重复的任务,例如每个月一次。 (或者,你能够用 dependabot 之类的服务,但请确保测试覆盖率良好)。

这样,你能够确保你的依存关系是最新的,并避免技术债。

更多参考


本文首发微信公众号:前端先锋

欢迎扫描二维码关注公众号,天天都给你推送新鲜的前端技术文章

欢迎扫描二维码关注公众号,天天都给你推送新鲜的前端技术文章

欢迎继续阅读本专栏其它高赞文章:


相关文章
相关标签/搜索