我应该依赖 package.json 还是对我的节点模块进行版本控制?

Posted

技术标签:

【中文标题】我应该依赖 package.json 还是对我的节点模块进行版本控制?【英文标题】:Should I rely on package.json or keep version control on my node modules? 【发布时间】:2017-11-25 18:06:09 【问题描述】:

最近,我正在研究 react-native 项目。我做了一个旧项目,我想将它克隆到一个新项目中,这样我就可以在旧版本的基础上开发一些新的东西,但不影响旧项目本身。

我发现每次npm install 使用相同的package.json 时,安装的node_modules 文件夹可能不一样。这可能是因为我们在某些模块的版本前面有前缀^~。此外,安装的模块也有自己的依赖关系,可以自行更新。

因此,问题来了。我应该使用 package.json 来做版本控制吗?

这里说:Why do we need to use package.json?,上面写着package.json provides a simple way for people to keep track of packages they use in their application.

但是,如果package.json 总是自行更新项目而不关心不同模块的兼容性,我该如何对我的项目进行版本控制。

我想到的唯一解决方案是:我们应该对 node_modules 进行版本控制。如果是这样,是不是 package.json 就变得毫无意义了?

那么,我想知道对node_modulespackage.json 相关项目进行版本控制的行业惯例是什么?

【问题讨论】:

【参考方案1】:

如果您使用的是 NPM 5 之前的版本,那么您应该查看NPM Shrinkwrap。这会锁定您当前使用的 NPM 模块的版本。一旦提交到该项目,如果其他人npm install 他们会得到收缩包装中指定的确切版本。

npm-shrinkwrap 锁定发布的依赖版本

随着NPM 5 的发布,当您默认运行npm install 时,它会自动创建一个package-lock.json 文件,类似于shrinkwrap。您应该将 lock 或 Shinkwrap 文件提交到您的 SCM。

您还应该查看Yarn。 Yarn 开箱即用,带有一个 yarn.lock 文件,该文件的工作方式相同,但具有更高的性能速度和离线功能。

使用详细但简洁的锁定文件格式和用于安装的确定性算法,Yarn 能够保证在一个系统上运行的安装将在任何其他系统上以完全相同的方式运行。

如果您已经有一个项目和node_modules 文件夹并希望更改为Yarn 而无需再次安装所有模块,那么您可以运行yarn import,它将根据您当前的节点模块文件夹生成一个锁定文件。

上述两种解决方案都意味着您不需要将node_modules 添加到 SCM - 当不同平台(windows、mac 等)上的用户在项目上工作时,这样做会增加其他复杂性。锁定文件应与您的项目一起提交。

【讨论】:

另外,从 npm 5 开始,npm 也有一个 lockfile (blog post)。 NPM 5 默认也使用锁文件,类似于 Yarn (package-lock.json)。 @Kerumen: 比我快 5 秒 :p 我明白了,但我当前的项目没有被NPM ShrinkwrapYarn 锁定。如果我现在做yarn install,它仍然会自动安装不兼容的node_module 并覆盖我的稳定node_module。我可以知道如何解决这个问题吗? 你现在可以运行npm shrinkwrap,它会锁定你已经安装的版本。

以上是关于我应该依赖 package.json 还是对我的节点模块进行版本控制?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在 package.json 中增加依赖版本?

Angular 6 更新 package.json 中过时的依赖项

节点使用 package.json 文件吗?

如何管理客户端JavaScript依赖项? [关闭]

package.json 开发依赖与运行时依赖

.min 或 src 作为 node_module 的 package.json 中的“主”文件