【问题标题】:How to deal with absolute imports when using git submodules使用 git 子模块时如何处理绝对导入
【发布时间】: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 回购并发布到那个。现在您将不得不处理所有这些相对路径。

标签: git npm yarnpkg


【解决方案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)

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

【讨论】:

  • 我该如何使用依赖注入来做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2017-01-25
  • 2014-05-02
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多