我想知道我们是否应该跟踪node_modules在我们的repo或做一个npm安装时检查出的代码?


当前回答

答案并不像阿尔贝托·扎卡尼所说的那么简单。如果您开发应用程序(特别是企业应用程序),在git repo中包含node_modules是一个可行的选择,选择哪种替代方案取决于您的项目。

因为他很好地反对node_modules,所以我将集中讨论支持它们的论点。

想象一下,你刚刚完成了一个企业应用程序,你必须支持它3-5年。你肯定不想依赖别人的npm模块,它明天就会消失,你就不能再更新你的应用了。

或者你有你的私有模块,不能从互联网上访问,你不能在互联网上创建你的应用。或者,出于某些原因,你可能不想依赖于npm服务的最终构建。

你可以在Addy Osmani的这篇文章中找到优缺点(尽管它是关于Bower的,但情况几乎相同)。我将引用Bower主页和Addy文章中的一段话作为结束:

“如果你正在创作的包不是要被其他人使用(例如,你正在构建一个web应用程序),你应该始终将已安装的包检查到源代码控制中。”

其他回答

我同意ivoszz的观点,有时检查node_modules文件夹是有用的,但是……


场景1:

一个场景: 你使用一个从npm中移除的包。 如果所有模块都在node_modules文件夹中,那么这对您来说就不是问题。 如果在包中只有包名。Json,你不能再得到它了。 如果一个包的使用时间小于24小时,可以很容易地从npm中删除它。 如果超过24小时,那么你需要联系他们。 但是:

如果您联系技术支持,他们将检查删除该版本的软件包是否会破坏任何其他安装。如果是,我们将不删除它。

阅读更多

所以出现这种情况的几率很低,但有第二种情况……


场景2:

另一种情况是这样的: 你开发了一个企业版本的软件或者一个非常重要的软件,在你的package.json中写道:

"dependencies": {
    "studpid-package": "~1.0.1"
}

使用该包的方法function1(x)。

现在studpid-package的开发人员将方法function1(x)重命名为function2(x),他们犯了一个错误… 它们将包的版本从1.0.1更改为1.1.0。 这是一个问题,因为当你下次调用npm install时,你将接受1.1.0版本,因为你使用了波浪号("studpid-package": "~1.0.1")。

现在调用函数1(x)可能会导致错误和问题。


But:

将整个node_modules文件夹(通常超过100 MB)推到存储库中会占用内存空间。 几个kb(包。json仅)相比,数百MB(包。Json & node_modules)…想想看。

你可以这样做/应该考虑如果:

软件非常重要。 当某件事失败了,你就得花钱。 你不相信NPM注册表。NPM是中心化的,理论上可以被关闭。

在99.9%的情况下,你不需要发布node_modules文件夹,如果:

你为自己开发了一个软件。 你编程了一些东西,只是想在GitHub上发布结果,因为其他人可能会对它感兴趣。


如果您不希望node_modules在存储库中,只需创建一个.gitignore文件并添加node_modules行。

如果package.json中提到了依赖关系,则Node_modules不需要检入。任何其他程序员都可以通过npm install来简单地获得它,npm足够聪明,可以让node_modules在你的项目工作目录中。

答案并不像阿尔贝托·扎卡尼所说的那么简单。如果您开发应用程序(特别是企业应用程序),在git repo中包含node_modules是一个可行的选择,选择哪种替代方案取决于您的项目。

因为他很好地反对node_modules,所以我将集中讨论支持它们的论点。

想象一下,你刚刚完成了一个企业应用程序,你必须支持它3-5年。你肯定不想依赖别人的npm模块,它明天就会消失,你就不能再更新你的应用了。

或者你有你的私有模块,不能从互联网上访问,你不能在互联网上创建你的应用。或者,出于某些原因,你可能不想依赖于npm服务的最终构建。

你可以在Addy Osmani的这篇文章中找到优缺点(尽管它是关于Bower的,但情况几乎相同)。我将引用Bower主页和Addy文章中的一段话作为结束:

“如果你正在创作的包不是要被其他人使用(例如,你正在构建一个web应用程序),你应该始终将已安装的包检查到源代码控制中。”

我建议不要签入node_modules,因为像PhantomJS和node-sass这样的包会为当前系统安装适当的二进制文件。

这意味着如果一个Dev在Linux上运行npm install并检入node_modules -它将不适用于另一个在Windows上克隆repo的Dev。

最好检查npm安装下载的tarball,并指向npm-shrinkwrap。Json。你可以使用收缩袋自动化这个过程。

模块详细信息存储在包中。Json就足够了。不需要签入node_modules。

人们习惯将node_modules存储在版本控制中,以锁定模块的依赖关系,但有了npm shrinkwrap,就不再需要这种方法了。

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

同样值得注意的是,任何涉及本机扩展的模块都不能在体系结构之间工作,需要重新构建。提供不将它们包括在回购中的具体理由。