首页 > 解决方案 > 未捕获的错误:找不到模块 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 吗?

标签: kotlinkotlin-multiplatformkotlin-js

解决方案


这是因为 Kodein 是 Gradle (Maven) 依赖项,它没有出现在 NPM 注册表中。您package.json仅使用 Kotlin 依赖项生成,但没有 Kodein(而且您不能,因为据我所知,NPM 中没有 Kodein)。

事实上,你需要将它与你的代码一起分发,否则你会得到这样的ReferenceError

例如,您可以将依赖项放入node_modulesnpm 包内的目录中。

现在我们正在开发基于封闭世界模型的 Kotlin/JS IR 编译器,它将生成捆绑了所有 Kotlin 库的 JavaScript 文件(但可以共享一些以防万一)。您可以在您的项目中尝试(如果您的依赖项有 IR 变体)


推荐阅读