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.json
和 package-lock.json
的不同用途。 在您进一步阅读之前,不,我不只是想总结一下它们的区别。
做了一些功课,我对它们的理解如下:
您希望将两者提交到源代码管理,因此.gitignore
中不应提及两者
package.json
描述你的项目并且可以做一些轻量级的依赖管理,例如,指定你想要最新版本的fizzbuzz
包,或者你想要最新版本的3.10.x
包的fizzbuzz
包
package-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 中获取数据?
如何将 node_modules 与实际的 package.json 同步?
应该如何为 Node.js docker 应用生成 package-lock.json 文件?