Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应该";节点“U模块”;无法将文件夹包含在git存储库中_Git_Node.js_Version Control_Npm - Fatal编程技术网

应该";节点“U模块”;无法将文件夹包含在git存储库中

应该";节点“U模块”;无法将文件夹包含在git存储库中,git,node.js,version-control,npm,Git,Node.js,Version Control,Npm,我想知道我们是应该在我们的repo中跟踪node_模块,还是在签出代码时安装npm?模块详细信息存储在包中。json,这就足够了。无需签入节点\u模块 人们过去常常在版本控制中存储node\u模块,以锁定模块的依赖项,但现在不再需要了 这一点的另一个理由是@ChrisCM在评论中写道: 同样值得注意的是,任何涉及本机扩展的模块都无法在体系结构之间工作,需要重新构建。提供不将其纳入回购协议的具体理由 答案并不像你想象的那么简单。如果您开发应用程序(尤其是企业应用程序),那么在git repo中包含

我想知道我们是应该在我们的repo中跟踪node_模块,还是在签出代码时安装npm?

模块详细信息存储在
包中。json
,这就足够了。无需签入
节点\u模块

人们过去常常在版本控制中存储
node\u模块
,以锁定模块的依赖项,但现在不再需要了

这一点的另一个理由是@ChrisCM在评论中写道:

同样值得注意的是,任何涉及本机扩展的模块都无法在体系结构之间工作,需要重新构建。提供不将其纳入回购协议的具体理由


答案并不像你想象的那么简单。如果您开发应用程序(尤其是企业应用程序),那么在git repo中包含节点_模块是一个可行的选择,您选择哪种替代方案取决于您的项目

因为他很好地反对node_模块,所以我将集中讨论它们的论点

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

或者,您的私人模块无法从internet访问,您无法在internet上构建应用程序。或者,出于某种原因,您可能不想依赖npm服务的最终构建

你可以找到优点和缺点(虽然是关于鲍尔的,但情况几乎是一样的)。最后,我将引用鲍尔主页和艾迪的文章:

“如果您编写的软件包不是供其他人使用的(例如,您正在构建web应用程序),则应始终将已安装的软件包签入源代码管理。”


我建议不要签入node_模块,因为像PhantomJS和node sass这样的软件包为当前系统安装了适当的二进制文件

这意味着,如果一个开发人员在Linux上运行
npm install
,并签入节点模块,那么它将不适用于另一个在Windows上克隆repo的开发人员。


最好检查一下npm安装下载的tarball,并指向
npm shrinkwrap.json
。可以使用.

不跟踪<代码> NoDEYMease源代码控制是正确的选择,因为一些NoDEJS模块,如MangoDB NoDEJS驱动程序,使用NoDEJS C++插件。这些附加组件是在运行
npm install
命令时编译的。因此,当您跟踪
node\u模块
目录时,可能会意外地提交一个特定于操作系统的二进制文件。

需要考虑的另一件事是:签入
node\u模块
会使使用
依赖项
依赖项
之间的差异变得更加困难/不可能


另一方面,如果package.json中提到了依赖项,则可以说推出经过测试的完全相同的代码是令人放心的——因此,如果package.json中提到依赖项,则不需要签入包含
devdependency

节点的模块。任何其他程序员都可以通过执行npm安装来获得它,并且npm足够智能,可以使项目的工作目录中的节点模块工作。

我知道,这个主题非常古老。但由于npm生态系统的情况发生了变化,我错过了这里提供的一些更新

我总是建议不要将node_模块置于版本控制之下。目前为止,在公认答案的上下文中列出的几乎所有这样做的好处都已经过时了

  • 已发布的包不能再轻易地从npm注册表中撤销。因此,您不必担心失去项目以前依赖的依赖关系

  • 将package-json.lock文件放在VCS中有助于处理频繁更新的依赖项,尽管依赖于相同的package.json文件,但可能会导致不同的设置

  • 因此,在有离线构建工具的情况下,将节点_模块放入VCS可能被认为是剩下的唯一合格用例。然而,node_模块通常增长非常快。任何更新都会改变很多文件。这以不同的方式影响着存储库。如果你真的认为长期影响也可能是一个障碍。

    像svn这样的集中式VCS需要通过网络传输提交的和签出的文件,这在签出或更新节点\模块文件夹时会非常缓慢

    说到git,这么多额外的文件会立即污染存储库。请记住,git并没有跟踪任何文件版本之间的差异,而是在单个字符发生更改后立即存储任何一个文件版本的副本。对任何依赖项的每次更新都将导致另一个大型变更集。由于这会影响备份和远程同步,您的git存储库将快速增长。如果您决定稍后从git存储库中删除节点_模块,出于历史原因,它仍然是其中的一部分。如果您已将git存储库分发到某个远程服务器(例如用于备份),则清理它是另一项痛苦且容易出错的任务

    因此,如果您关心高效的流程,并且希望保持事情“小”,我宁愿使用一个单独的工件存储库,比如Nexos存储库(或者只是一些带有ZIP存档的HTTP服务器)提供一些以前获取的依赖项集供下载。

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


    场景1:

    一种情况: 您使用从npm中删除的包。 如果您在文件夹node_modules中有所有模块,那么对您来说就不会有问题。 如果package.json中只有包名,则可以
    "dependencies": {
        "studpid-package": "~1.0.1"
    }