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

Posted

技术标签:

【中文标题】Node.JS:使用多个 Git 存储库【英文标题】:Node.JS: Working with multiple Git repositories 【发布时间】:2015-05-26 04:20:44 【问题描述】:

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

例如:

common 模块驻留在自己的存储库中。 execution 模块驻留在单独的存储库中,并具有 (npm) 对 common 的依赖关系。

所以,execution 中的目录结构包括(一旦执行npm installcommonnode_modules 下。

我们的问题是,当开发人员在处理execution 时,他们有时也需要修改common。为了“看到”他们的变化,他们有我们目前使用的两个选项之一:要么修改node_modules/common(这是丑陋的、未跟踪的等),要么修改common存储库,然后push+npm安装他们的更改(虽然更简洁,但相当麻烦)。

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

【问题讨论】:

您是否考虑过拥有一个 git repo (monorepo)? 【参考方案1】:

您可以避免使用npm link 命令修改您的package.json 文件。这将自动配置execution 包以将其node_modules/common 目录符号链接到您的本地克隆common

如何使用此方法

    在您的common 目录中输入:npm link。这将在npm 中创建对common 文件夹的全局引用,由common 标识(假设common 是您的节点包的确切名称)。 在您的execution 目录中输入:npm link common。这会将node_modules/common 文件夹符号链接到common 目录的本地副本中。

当您完成对common 文件夹的更改后,您需要在线更新该软件包,然后将executionpackage.json 更改为指向common 的更新版本。

我更喜欢这种方法而不是建议将package.json 指向您的本地存储库的方法,因为这会使您的package.json 处于无效状态,您可能会不小心提交和推送。

【讨论】:

【参考方案2】:

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

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

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

如何添加本地依赖

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

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

【讨论】:

嗨,Vishwanath,谢谢。我要试试这个(具体来说,我们要试试 devDependencies,所以这个配置不会影响生产)。一旦我们验证,我会接受答案。【参考方案3】:

npm 链接的问题

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

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

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

解决方案

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

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

在根目录中:

/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

【讨论】:

以上是关于Node.JS:使用多个 Git 存储库的主要内容,如果未能解决你的问题,请参考以下文章

如何同步 Node js 应用程序、git 和 Heroku?

Heroku Node.js Discord.js 机器人部署失败

使用弹性 beantalk 部署复杂的 node.js 项目

MEAN 项目 - 组织

ubuntu18.04下安装node

GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。