“node_modules”文件夹应该包含在git仓库中

我想知道是否应该在我们的仓库中跟踪node_modules,或者在签出代码时进行npm安装?

答案并不像阿尔贝托·扎卡尼所说的那样简单。 如果你开发应用程序(特别是企业应用程序),包括你的git仓库中的node_modules是一个可行的select,你select哪一个select取决于你的项目。

因为他对node_modules的争论非常好,所以我将集中讨论他们的观点。

想象一下,你刚刚完成企业应用程序,你将不得不支持3 – 5年。 你绝对不想依靠某人的npm模块,明天可能会消失,你不能更新你的应用程序了。

或者你有你的私人模块不能从互联网上访问,你不能在互联网上build立你的应用程序。 或者,也许你不想依靠你最终的build设npm服务出于某种原因。

你可以在这篇Addy Osmani的文章中find优点和缺点(虽然是关于Bower,但情况几乎相同)。 最后,我会以Bower主页和Addy的文章引用结尾:

“如果你不是创作一个打算被别人使用的软件包(例如,你正在构build一个web应用程序),你应该总是把安装的软件包检查到源代码控制中。

模块细节存储在packages.json ,这就够了。 没有必要检查node_modules

人们习惯在版本控制中存储node_modules来locking模块的依赖关系,但是使用npm不再需要的shrinkwrap。

另一个理由就是@ChrisCM在评论中写道:

另外值得注意的是,任何涉及本地扩展的模块都不能将体系结构用于体系结构,而需要重build。 提供具体的理由不包括他们在回购。

我build议不要检查node_modules,因为像PhantomJS和node-sass这样的软件包会为当前系统安装相应的二进制文件。

这意味着,如果一个Dev在Linux上运行npm install ,并检查node_modules – 对于在Windows上克隆repo的另一个Dev不起作用。

最好检查一下npm安装下载的tarball,并指向npm-shrinkwrap.json 。 您可以使用收缩包自动执行此过程。

不使用源代码pipe理来跟踪node_modules是正确的select,因为一些NodeJS模块(如MongoDB NodeJS驱动程序)使用NodeJS C ++加载项。 运行npm install命令时会编译这些附件。 所以,当你跟踪node_modules目录时,你可能会意外提交一个操作系统特定的二进制文件。

还有一件事要考虑:检查node_modules使得使用dependenciesdevDependencies之间的区别变得困难/不可能。

另一方面,有人可能会说,向生产推送经过testing的完全相同的代码(包括devDependencies

在Windows上testing到Mac ios

如果您已经提交了Git Repository中除“ node_modules ”之外的所有文件。
您可以使用Git Clone ,只需运行npm install命令从“ package.json ”文件中自动获取“ node_modules ”文件夹。

确保你提交“ package.json ”文件,以便从npm package manager自动/直接获取依赖模块。