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 install
)common
在node_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
文件夹的更改后,您需要在线更新该软件包,然后将execution
的package.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 unlink
或npm unlink <package-name>
,但这会将其从package.json
中删除。 npm i
也不会删除链接。
如果您有多个要链接的依赖关系级别,则它不起作用,尤其是当与依赖关系存在复杂关系时,例如:
- root:
-- dependencyC
-- dependencyA [linked]:
--- dependencyB
-- dependencyB [linked]:
--- dependencyC
因为dependencyC
将是root
和dependencyB
中的不同引用。您必须在本地链接所有此类依赖项才能使其正常工作。函数式编程的问题不大,但对于 OO 类/原型,它会说引用不匹配。
解决方案
在我们自己的开发中寻找解决这个问题的方法时,我遇到了https://github.com/coopcycle/coopcycle-js/issues/4,它提到只需使用ln -sf <link>
而不是npm link
,因为ln
会为您创建一个符号链接。它快速(即时)、易于理解且易于撤消(只需运行 npm i
)。
鉴于上面的相同示例(想要将 dependencyA
和 dependencyB
链接到 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
的相对路径。
在依赖项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 项目
GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。