kotlin - 未捕获的错误:找不到模块 Kodein-DI-kodein-di
问题描述
我正在构建一个针对 JVM、Windows、JS 和 MacOS 的 kotlin MPP 库。
对于 JS,我的 gradle 文件看起来像这样
kotlin {
targets {
jvm()
js {
browser {
}
nodejs {
}
}
mingwX64("windows") {
binaries {
sharedLib {
baseName = "lib"
}
staticLib {
baseName = "lib"
}
}
}
macosX64("macos") {
binaries {
sharedLib {
baseName = "lib"
}
}
}
sourceSets {
commonMain {
dependencies {
implementation(kotlin("stdlib-common"))
implementation("org.kodein.di:kodein-di:$kodeinVersion")
}
}
commonTest {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
implementation("io.mockk:mockk-common:$mockkVersion")
}
}
getByName("jvmMain").dependencies {
implementation(kotlin("stdlib-jdk8"))
}
getByName("jvmTest").dependencies {
implementation(kotlin("test"))
implementation(kotlin("test-junit"))
implementation("io.mockk:mockk:$mockkVersion")
}
getByName("jsMain").dependencies {
implementation(kotlin("stdlib-js"))
}
getByName("jsTest").dependencies {
implementation(kotlin("test-js"))
}
getByName("macosMain").dependencies {
}
getByName("macosTest").dependencies {
}
getByName("windowsMain").dependencies {
}
getByName("windowsTest").dependencies {
}
}
}
sourceSets {
all {
languageSettings.enableLanguageFeature("InlineClasses")
}
}
configure(listOf(metadata(), jvm(), js(), macosX64("macos"), mingwX64("windows"))) {
mavenPublication {
val targetPublication = this@mavenPublication
tasks.withType<AbstractPublishToMaven>()
.matching { it.publication == targetPublication }
}
}
}
task("generateJsPackageJson") {
doLast {
File("$buildDir/js/packages/${project.name}/kotlin", "package.json")
.writeText(
"""{
"name": "@org/${project.name.toLowerCase()}",
"version": "$version",
"main": "${project.name}.js",
"url": "https://gitlab.com/org/common/multiplatform/lib",
"dependencies": {
"kotlin": "^${kotlin.coreLibrariesVersion}"
},
"publishConfig": {
"@org:registry":"https://gitlab.com/api/v4/projects/${System.getenv("CI_PROJECT_ID")}/packages/npm/"
}
}
"""
)
}
}
我在 JS 上的库的使用者使用我们 GitLab 注册表中的 npm 安装包,并且工作正常。他们遇到的问题如下:
Uncaught Error: Cannot find module 'Kodein-DI-kodein-di'
Require stack:
- /tmp/test-lib/node_modules/@org/lib/Index.js
- <repl>
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
at Function.Module._load (internal/modules/cjs/loader.js:841:27)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at /tmp/test-lib/node_modules/@org/lib/Index.js:5:48 {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/tmp/test-lib/node_modules/@org/lib/Index.js',
'<repl>'
]
}
如何将我对 Kodein 的依赖隐藏到我的 JS 客户端?我对 gradle 依赖项管理如何工作的理解是,使用实现应该在编译和运行时添加依赖项,但仅适用于您的模块而不是其外部客户端。这是因为我在我的 Lib 的非内部包和类中使用 KodeIN 吗?
解决方案
这是因为 Kodein 是 Gradle (Maven) 依赖项,它没有出现在 NPM 注册表中。您package.json
仅使用 Kotlin 依赖项生成,但没有 Kodein(而且您不能,因为据我所知,NPM 中没有 Kodein)。
事实上,你需要将它与你的代码一起分发,否则你会得到这样的ReferenceError
例如,您可以将依赖项放入node_modules
npm 包内的目录中。
现在我们正在开发基于封闭世界模型的 Kotlin/JS IR 编译器,它将生成捆绑了所有 Kotlin 库的 JavaScript 文件(但可以共享一些以防万一)。您可以在您的项目中尝试(如果您的依赖项有 IR 变体)
推荐阅读
- android - 如何在不初始化的情况下在 Kotlin 中创建变量?
- google-sheets - 在 Google 表格的一组数据中添加空白行
- eclipse - ubuntu 18 上 Eclipse 中的键盘快捷键
- c++ - 共享指针和具有自定义删除器的唯一指针之间的语法差异背后的任何原因
- face-detection - 使用 IR 图像进行人脸检测
- javascript - 使用 .js (JavaScript) 文件使 ipodlinux.org 上的不可点击链接可点击
- jenkins - 强制 UTF8 环境变量 Jenkins
- python - 由于数据长度不等,将嵌套 JSON 列表展平为 Pandas DataFrame 的问题
- python - 字典只返回部分答案(也许是关于缩进)
- c++ - 提升范围和 ADL 查找导致不明确的调用