使用 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 子模块时如何处理绝对导入的主要内容,如果未能解决你的问题,请参考以下文章