使用 git 子模块时如何处理绝对导入

Posted

技术标签:

【中文标题】使用 git 子模块时如何处理绝对导入【英文标题】:How to deal with absolute imports when using git submodules 【发布时间】:2020-05-06 11:59:09 【问题描述】:

我最近将一个子模块添加到在导入中使用绝对路径的项目中

在子模块中:

/src/main.js
import Component from 'src/components/Component'
export default ...

并且在父项目中

import Main from 'submodule/src/main'
...

这将导致Unable to resolve module 因为 src/components/Component 不存在。有什么解决办法吗?

【问题讨论】:

我个人不会做 git 子模块。我会做一个本地 NPM 回购并发布到那个。现在您将不得不处理所有这些相对路径。 【参考方案1】:

我建议不要将这些路径固定到子模块中,而是在运行时加载这些依赖项。这样,您可以在调用它们时提供路径。这种模式称为dependency injection

另一种解决方案是重构子模块,使其完全不依赖任何外部路径(恕我直言,这将是最干净的解决方案,但并不总是可行且高效)

以下是一般实现 DI 的方法(另外我刚刚注意到您的问题是关于 js,而不是 python。除了语法之外,它应该工作相同):

假设您的 SubModule 名为“mySubModule”,如下所示:

import myModule

def myFunction(myParameter):
  myModule.doStuff()

使用依赖注入它看起来像这样:

def myFunction(myModule):
  myModule.doStuff()

每次调用myFunction 时,您都必须提供模块myModule 作为参数。像这样:

import mySubModule
import myModule
mySubModule.myFunction(myModule)

您也可以在子模块中使用全局变量:

myModule = None
def myFunction(myParameter):
  myModule.doStuff()

在您第一次调用myFunction 之前,您必须从外部设置模块。像这样:

import mySubModule
import myModule
mySubModule.myModule = myModule
mySubModule.myFunction(myModule)

如果您的子模块中有一个类,您还可以将模块作为参数提供给构造函数。我认为这将是最干净的方式

【讨论】:

我该如何使用依赖注入来做到这一点?

以上是关于使用 git 子模块时如何处理绝对导入的主要内容,如果未能解决你的问题,请参考以下文章

处理包/模块中的错误时如何处理Python异常

当 UI 允许新对象时如何处理取消

如何从 aws lambda 中的 git 子模块导入代码?

Git 如何处理二进制文件?

Git子模块的本地导入错误 - Python

构建同构 React 应用程序时如何处理 SASS 的导入?