每个 NPM 项目的 git 分支是否都有不同的 node_modules 依赖关系?

19

我假设在开发NPM项目时,每个git分支(或者其他版本控制系统)可能指向文件系统上不同的node_modules集合。这是真的吗?它是如何工作的?会对磁盘空间造成任何问题吗?

或者说,由于node_modules通常被.gitignore忽略,那么node_modules文件是否在Git分支之间共享?如果是,那又是如何工作的呢?

*需要注意的是,Node.js/NPM与其他平台/语言基本不同,因为依赖项通常存储在项目的本地位置而不是机器上某个中央位置。


1
不是的。可能有一种方法可以做到这一点,但我将 node_modules 添加到 .gitignore 中,并且因为同一目录中只有一个分支被检出,所以它们都使用相同的模块。 - Jeff Puckett
这不太合理——如果一个分支有完全不同的依赖项或版本,那怎么办?我认为gitignore解决不了这个问题... - Alexander Mills
如果一个分支与另一个分支有完全不同的依赖关系,那么它可能是一个不同的项目,也许应该放在自己的仓库中。您是否打算将这些分支合并在一起?话虽如此,您可以完全向不同的分支提交不同的 node_modules,但磁盘空间会很快被占满,特别是因为 git 不存储增量,而是整个仓库的快照。您最好提交不同的 package.json 文件,并运行一个 git 钩子,在分支检出时重新安装依赖项。 - Jeff Puckett
5个回答

27
按惯例,不应添加可以从外部源生成或拉取的任何文件、库或二进制文件。这包括像node_modules这样的东西;因为一旦你执行npm install,它就会变得容易获得,所以没有理由或动力将其放入您的源代码控制中。最坏的情况是,它还会使您的存储库膨胀,用您无法控制并且不一定想要审查的内容来填充您的差异。
我不希望NPM项目的不同Git分支包含不同的node_modules文件夹。我只希望有一个node_modules文件夹,如果一个分支让我对依赖关系感到困惑,我会尝试重新安装依赖关系(并将其记录下来,以确保其他问题未出现)。
作为附加说明,.gitignore中的任何文件或文件夹都不会被Git索引或跟踪。如果这些文件或文件夹的内容发生变化,Git也不会知道。这也意味着,在切换分支时,.gitignore中的文件或文件夹的内容保持不变。
注:只要使用的库不突然被撤回,或者该存储库没有受到巨大的DDoS影响。可能会有某些激励这样做,因为今年某些NPM包的可靠性未达到100%,但这是一个团队和架构驱动的决定,我怀疑将其放入源代码控制中是处理它最理想和方便的方式。

11
代码仓库包含所有的依赖,环境部署更加可靠稳定。

构建速度更快。在本地或CI/CD服务器上也不需要重新安装依赖。

Concerns: 代码仓库变得很大。

存储空间成本会增加。

可能会因为误操作将敏感信息提交到代码仓库中(例如密码、API密钥等)。

总而言之,这两种方法都有一些优点和缺点。选择哪种方法取决于您的具体情况。

不依赖第三方源。您拥有运行所需的一切。您的代码可以永久独立运行,而无论npm是否宕机或存储库被删除都没有关系。
分支是独立的,因此Dev1的新功能在Dev2切换到该分支时会自动包含。
部署时间更短,因为不需要安装太多内容。 注意事项: 存储库更大。克隆代码需要更长时间,因为有更多的文件。
拉取请求需要额外小心。如果一个包与核心代码一起更新(或安装),则PR可能混乱且有时难以理解。 "更改了500个文件",但实际上只更新了一个包并更改了两行核心代码。将其拆成两个PR可能会有所帮助 - 一个是混乱的(包更新),另一个是可审查的(核心代码更改)。同样,为此做好准备。包不会太经常更改,但当它们更改时,您的代码审查需要更长时间(或更多小心)。
依赖于操作系统的软件包可能会中断。基本上,使用gyp编译/安装的所有内容可能会依赖于操作系统(等等)。大多数包是“纯JS”的,并且由于只是脚本,因此可以在任何地方运行。想象一下,所有开发人员都在OSX上运行和测试,而您则在Linux上部署,您不能将那些在MAC上编译的软件包检入,因为它们无法在Linux上运行。这方面的一个奇怪解决方法是将大多数包定义为“开发依赖项”(--save-dev),而将需要编译的包设为正常状态(“生产”,--save),然后运行npm install --production以便不安装开发依赖项(并且已经存在),但其他依赖项仍需安装。

结论

这取决于情况。(难道你不讨厌总听到这句话吗?: ))
根据您的团队和问题,您可能会选择其中一种方法。两种方法都有其优点,您将决定哪种对您更有利。两者都有缺点,因此在被咬之前要意识到这些缺点!

5

个人而言,我忽略 .node_modules 目录,但是在不同的分支中我有不同的 package.json 文件,在切换分支时我会重新安装依赖。


4

当一个分支处于开发阶段而另一个分支是生产分支时,两个分支会有不同的节点模块集。在这种情况下,开发分支将比生产分支拥有更多的节点模块。如果我没记错的话,任何其他情况都可能会给你带来麻烦。

node_modules推送到远程版本控制仓库是不好的实践,因此只需在克隆分支或拉取代码时依靠npm install下载添加到package.json的任何新节点模块即可。


3

显然,由于您的 node_modules 不在您实际的代码仓库中,因此您需要再次安装 node 模块,每个分支可能都有自己的要求。例如,您可能会使用新的依赖项更新 server.js,还需要确保生产服务器中有这些新添加的 node 依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接