Node.JS:如何处理多个 Git 存储库

5
我们有一个Node.js项目,它由几个模块组成,跨越多个Git存储库。这些模块之间存在依赖关系。
例如: common模块位于其自己的存储库中。 execution模块位于单独的存储库中,并且对common有(npm)依赖。
因此,在执行npm install后,execution中的目录结构包括node_modules下的common
我们的问题是,当开发人员在execution上工作时,他们有时也需要修改common。为了“看到”他们的更改,他们目前有两种选择:要么修改node_modules/common(这很丑陋、不可追踪等),要么修改common存储库,然后推送+npm安装他们的更改(虽然更干净,但相当麻烦)。
我们想知道是否有更好的替代方案来解决这个工作流程...

你是否考虑过使用单个Git仓库(单体仓库)? - milan
3个回答

7
您可以使用npm link命令来避免修改您的package.json文件。这将自动配置execution软件包,以使其符号链接其node_modules/common目录到您本地的common克隆版。 如何使用此方法
  1. 在您的common目录中键入:npm link。这将创建一个全局引用到您的npm中的common文件夹,由common(假设common是您的节点包的确切名称)标识。
  2. 在您的execution目录中键入:npm link common。这将符号链接node_modules/common文件夹到您本地的common目录。
当您完成对common文件夹进行更改后,您需要在线更新该软件包,然后更改executionpackage.json,以指向更新版本的common
我喜欢这种方法而不是建议将package.json指向您的本地存储库的方法,因为这会使您的package.json处于无效状态,您可能会意外提交和推送。

3
我假设您正在使用package.json作为依赖项,并允许您使用名称而不是路径来使用它们。(这也包括版本处理的好处)。我没有找到任何选项可以删除npm install步骤,但我找到了一个可以删除git push步骤并使npm install更快的方法。 本地依赖。
使用本地路径作为依赖项,可以是您的其他git repo,您可以直接更改其依赖项的git repo代码。这样,您就可以在不进行推送的情况下更改代码并测试它。(尽管您必须在主模块中再次执行npm install,这将在您的node modules中复制依赖项的工作副本)。
注意:您必须确保完成两者的工作后将对依赖项代码所做的最终更改推送,否则其他开发人员可能会处于不一致状态。 如何添加本地依赖项
 "dependencies" : {
       "here" : "file:./test/git/repo/here#0.0.1"
 }

请注意,本地依赖项功能是在npm 2.0版本中添加的。因此,如果您没有npm 2.0+,可能需要更新您的node。


嗨,Vishwanath, 谢谢。我将尝试这个(具体来说,我们将尝试使用devDependencies,因此此配置不会影响生产)。一旦我们验证了,我就会接受这个答案。 - Gadi

0

npm link的问题

npm link通常运行良好,但在链接多个包时存在一些问题:

  1. 速度较慢。
  2. 测试完成后取消链接很困难。您可以运行npm unlinknpm unlink <package-name>,但这将从package.json中删除它。 npm i也不会删除链接。
  3. 如果您想要链接多个依赖项,特别是当依赖项之间存在复杂关系时,则无法正常工作。
- root:
-- dependencyC
-- dependencyA [linked]:
--- dependencyB
-- dependencyB [linked]:
--- dependencyC

由于dependencyCrootdependencyB中是不同的引用,因此您必须将所有这样的依赖项本地链接才能使其正常工作。对于函数式编程来说并不是什么问题,但对于OO类/原型来说,它会说引用不匹配。

解决方案

在寻找我们自己开发的解决方案时,我遇到了https://github.com/coopcycle/coopcycle-js/issues/4,其中提到只需使用ln -sf <link>而不是npm link,因为ln会为您创建符号链接。它快速(瞬间完成),易于理解,易于撤消(只需运行npm i)。

给定上面的相同示例(想要将dependencyAdependencyB链接到root),您将运行:

在root中:

/root % npm i
/root % cd node_modules
/root % rm -rf dependencyA
/root % rm -rf dependencyB
/root % ln -sf ../../../dependencyA
/root % ln -sf ../../../dependencyB

假设../../../dependencyA是相对路径到dependencyA
dependencyA中:
/root % npm i
/root % cd node_modules
/root % rm -rf dependencyB
/root % ln -sf ../../../root/node_modules/dependencyB

在 dependencyB 中:

/root % npm i
/root % cd node_modules
/root % rm -rf dependencyC
/root % ln -sf ../../../root/node_modules/dependencyC

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