Node.JS:使用多个 Git 存储库

Node.JS: Working with multiple Git repositories

我们有一个 node.js 项目,其中包含一些跨越多个 Git 存储库的模块。模块之间存在依赖关系。

例如:

common 模块驻留在它自己的存储库中。 execution 模块驻留在一个单独的存储库中,并且对 common.

具有 (npm) 依赖性

因此,execution中的目录结构包括(一旦npm install被执行)commonnode_modules下。

我们的问题是,当开发人员在 execution 上工作时,他们有时也需要修改 common。为了 'see' 他们的更改,他们有我们目前使用的两个选项之一:要么修改 node_modules/common(这是丑陋的,未跟踪的,等等),要么修改 common 存储库,然后push+npm install 他们的更改(虽然更干净,但非常麻烦)。

我们想知道这个工作流程是否有更好的替代方案...

我假设您使用 package.json 将它们用作依赖项,这允许您使用名称而不是路径来要求它们。 (你也有版本处理的好处。)。我找不到任何选项来删除 npm install 的步骤,但我确实找到了一些可以删除 git push 步骤的东西,这将使你的 npm 安装更快。

本地依赖。
使用本地路径作为依赖项(可以是您的其他 git 存储库),您可以直接对依赖项的 git 存储库进行更改。这允许您更改代码并在不推送的情况下对其进行测试。 (虽然你必须在主模块中再次执行 npm install,这将在你的节点模块中复制你的依赖项的工作副本)。

注意事项:您必须小心,一旦完成对依赖代码的最终更改,就必须推送它们,否则其他开发人员可能会进入不一致的状态。

如何添加本地依赖

 "dependencies" : {
       "here" : "file:./test/git/repo/here#0.0.1"
 }

请注意,这个本地依赖特性是在 2.0 版本中添加到 npm 中的。因此,如果您还没有 npm 2.0+

,您可能需要更新您的节点

您可以使用 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 处于无效状态,您可能会不小心提交和推送。

npm 问题 link

npm link 通常工作得很好,但是当您有多个包的更复杂 linking 时,它会出现一些问题:

  1. 速度很慢。
  2. 在本地完成测试后,很难取消link 事情。您可以 运行 npm unlinknpm unlink <package-name> 但这会将其从 package.json 中删除。 npm i 也不删除 link.
  3. 如果您想要 linked 多个级别的依赖关系,则它不起作用,尤其是当与依赖关系存在复杂关系时,例如:
- root:
-- dependencyC
-- dependencyA [linked]:
--- dependencyB
-- dependencyB [linked]:
--- dependencyC

因为 dependencyC 将是 rootdependencyB 中的不同引用。您必须在本地 link 所有此类依赖项才能正常工作。与其说是函数式编程的问题,不如说是 OO classes/prototypes,它会说引用不匹配。

解决方案

在我们自己的开发中寻找这个问题的解决方案时,我遇到了 https://github.com/coopcycle/coopcycle-js/issues/4,其中提到简单地使用 ln -sf <link> 而不是 npm link 作为 ln 创建一个 symlink 给你。它快速(即时)、易于理解且易于撤消(只需 运行 npm i)。

给出上面相同的例子(想要 link dependencyAdependencyBroot)你会 运行:

在根目录中:

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

假设../../../dependencyAdependencyA的相对路径。

依赖A:

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

依赖B:

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