我假设在开发NPM
项目时,每个git
分支(或者其他版本控制系统)可能指向文件系统上不同的node_modules
集合。这是真的吗?它是如何工作的?会对磁盘空间造成任何问题吗?
或者说,由于node_modules
通常被.gitignore忽略
,那么node_modules
文件是否在Git分支之间共享?如果是,那又是如何工作的呢?
*需要注意的是,Node.js/NPM与其他平台/语言基本不同,因为依赖项通常存储在项目的本地位置而不是机器上某个中央位置。
我假设在开发NPM
项目时,每个git
分支(或者其他版本控制系统)可能指向文件系统上不同的node_modules
集合。这是真的吗?它是如何工作的?会对磁盘空间造成任何问题吗?
或者说,由于node_modules
通常被.gitignore忽略
,那么node_modules
文件是否在Git分支之间共享?如果是,那又是如何工作的呢?
*需要注意的是,Node.js/NPM与其他平台/语言基本不同,因为依赖项通常存储在项目的本地位置而不是机器上某个中央位置。
node_modules
这样的东西;因为一旦你执行npm install
,它就会变得容易获得,所以没有理由或动力将其放入您的源代码控制中。最坏的情况是,它还会使您的存储库膨胀,用您无法控制并且不一定想要审查的内容来填充您的差异。node_modules
文件夹。我只希望有一个node_modules
文件夹,如果一个分支让我对依赖关系感到困惑,我会尝试重新安装依赖关系(并将其记录下来,以确保其他问题未出现)。.gitignore
中的任何文件或文件夹都不会被Git索引或跟踪。如果这些文件或文件夹的内容发生变化,Git也不会知道。这也意味着,在切换分支时,.gitignore
中的文件或文件夹的内容保持不变。构建速度更快。在本地或CI/CD服务器上也不需要重新安装依赖。
Concerns: 代码仓库变得很大。
存储空间成本会增加。
可能会因为误操作将敏感信息提交到代码仓库中(例如密码、API密钥等)。
总而言之,这两种方法都有一些优点和缺点。选择哪种方法取决于您的具体情况。
不依赖第三方源。您拥有运行所需的一切。您的代码可以永久独立运行,而无论npm是否宕机或存储库被删除都没有关系。gyp
编译/安装的所有内容可能会依赖于操作系统(等等)。大多数包是“纯JS”的,并且由于只是脚本,因此可以在任何地方运行。想象一下,所有开发人员都在OSX上运行和测试,而您则在Linux上部署,您不能将那些在MAC上编译的软件包检入,因为它们无法在Linux上运行。这方面的一个奇怪解决方法是将大多数包定义为“开发依赖项”(--save-dev
),而将需要编译的包设为正常状态(“生产”,--save
),然后运行npm install --production
以便不安装开发依赖项(并且已经存在),但其他依赖项仍需安装。
这取决于情况。(难道你不讨厌总听到这句话吗?: ))结论
个人而言,我忽略 .node_modules 目录,但是在不同的分支中我有不同的 package.json 文件,在切换分支时我会重新安装依赖。
当一个分支处于开发阶段而另一个分支是生产分支时,两个分支会有不同的节点模块集。在这种情况下,开发分支将比生产分支拥有更多的节点模块。如果我没记错的话,任何其他情况都可能会给你带来麻烦。
把node_modules推送到远程版本控制仓库是不好的实践,因此只需在克隆分支或拉取代码时依靠npm install下载添加到package.json的任何新节点模块即可。
显然,由于您的 node_modules 不在您实际的代码仓库中,因此您需要再次安装 node 模块,每个分支可能都有自己的要求。例如,您可能会使用新的依赖项更新 server.js,还需要确保生产服务器中有这些新添加的 node 依赖项。
node_modules
添加到.gitignore
中,并且因为同一目录中只有一个分支被检出,所以它们都使用相同的模块。 - Jeff Puckettnode_modules
,但磁盘空间会很快被占满,特别是因为 git 不存储增量,而是整个仓库的快照。您最好提交不同的package.json
文件,并运行一个 git 钩子,在分支检出时重新安装依赖项。 - Jeff Puckett