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

Should I rely on package.json or keep version control on my node modules?

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

我发现每次我用相同的 package.json 执行 npm install 时,安装的 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 相关项目上进行版本控制的行业惯例是什么?

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

npm-shrinkwrap
Lock down dependency versions for publication

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

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

Using a detailed, but concise, lockfile format, and a deterministic algorithm for installs, Yarn is able to guarantee that an install that worked on one system will work exactly the same way on any other system.

如果你已经有一个项目和node_modules文件夹并且希望在不重新安装所有模块的情况下切换到Yarn,那么你可以运行 yarn import这将生成一个锁定文件基于您当前的节点模块文件夹。

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