Node 应用中 package.json 与 package-lock.json 的信息和变更管理

Posted

技术标签:

【中文标题】Node 应用中 package.json 与 package-lock.json 的信息和变更管理【英文标题】:Information and change management of package.json vs package-lock.json in Node apps 【发布时间】:2021-09-17 06:28:09 【问题描述】:

请注意:这里有许多类似的问题,但我相信我确实在问一个新的+独特的问题。


我是 Node 和 javascript 的新手,我正在尝试了解 package.jsonpackage-lock.json 的不同用途。 在您进一步阅读之前,我不只是想总结一下它们的区别。

做了一些功课,我对它们的理解如下:

您希望将两者提交到源代码管理,因此.gitignore 中不应提及两者 package.json 描述你的项目并且可以做一些轻量级的依赖管理,例如,指定你想要最新版本的fizzbuzz 包,或者你想要最新版本的3.10.x 包的fizzbuzzpackage-lock.json 纯粹用于依赖管理,并详细说明您的项目应该使用哪些特定依赖;例如,如果您在package.json 文件中指定想要最新的3.10.x 版本的fizzbuzz,则package-lock.json 文件可能会指定fizzbuzz-3.10.24,等等。 你直接修改/编辑你的package.json文件,但你只让NPM和其他命令行工具修改你的package-lock.json(因此任何人都不应该编辑package-lock.json

这些说法正确吗?如果没有,有人可以提供一些关于我的理解如何/在哪里出错的详细信息吗?

【问题讨论】:

【参考方案1】:

小答案

你的理解是正确的。

要运行基本的 Nodejs 项目,您只需要在项目中添加 package.json 文件,我的意思是它是必需的。

package.json 用于保存项目的依赖关系。它还定义了项目属性,如描述、作者、许可证信息、脚本等。

package-lock.json 用于将依赖项保持在特定版本号中。它记录了每个安装包的确切版本,允许您在不同的环境中安装相同版本的包。

简短回答

为什么要创建package-lock.json

当您使用以下命令在项目中安装软件包时。例如

npm install node-sass --save

,它将在您的项目中安装该软件包的确切最新版本,并将依赖项保存在带有克拉 (^) 符号的 package.json 中。

"node-sass": "^6.0.0"

克拉 (^) 表示它将支持任何更高版本的主版本。这里创建了package-lock.json,用于锁定已安装版本的依赖关系,在本例中为 6。

package-lock.json有什么用?

如上所述,它记录了每个已安装软件包的确切版本,允许您重新安装它们。这允许您在不同的环境中生成相同的结果。为此,我们应该使用package-lock.json 文件来安装依赖项。

为什么我们应该将package-lock.json 与我们的项目源代码一起提交(到 Git)?

在部署期间,当您在服务器或具有相同 package.json 文件但没有 package-lock.json 的任何环境上运行 npm i(或 npm install)时,安装的软件包现在可能具有比您拥有的更高版本故意的。在这种情况下,如果您的代码针对其中某些包的特定版本,您可能会遇到问题。

参考文献

https://docs.npmjs.com/cli/v7/configuring-npm/package-lock-json

【讨论】:

以上是关于Node 应用中 package.json 与 package-lock.json 的信息和变更管理的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?

npm命令用于卸载或修剪Node.js中未使用的包

如何将 node_modules 与实际的 package.json 同步?

应该如何为 Node.js docker 应用生成 package-lock.json 文件?

软件版本号规范与命名原则(node.js与package.json依赖包规范)

package.json执行与量角器中的其他构建工具有什么不同以便执行?