Kotlin 未捕获错误:找不到模块Kodein DI Kodein DI
我正在构建一个针对JVM、Windows、JS和MacOS的kotlin MPP库 对于JS,我的gradle文件如下所示Kotlin 未捕获错误:找不到模块Kodein DI Kodein DI,kotlin,kotlin-multiplatform,kotlin-js,Kotlin,Kotlin Multiplatform,Kotlin Js,我正在构建一个针对JVM、Windows、JS和MacOS的kotlin MPP库 对于JS,我的gradle文件如下所示 kotlin { targets { jvm() js { browser { } nodejs { } } mingwX64("windows") { bina
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/"
}
}
"""
)
}
}
kotlin{
目标{
jvm()
js{
浏览者{
}
nodejs{
}
}
mingwX64(“窗口”){
二进制文件{
共享数据库{
baseName=“lib”
}
静态库{
baseName=“lib”
}
}
}
macosX64(“macos”){
二进制文件{
共享数据库{
baseName=“lib”
}
}
}
源集{
普通人{
依赖关系{
实施(kotlin(“stdlib通用”))
实现(“org.kodein.di:kodein di:$kodeinVersion”)
}
}
普通测试{
依赖关系{
实现(kotlin(“测试通用”))
实现(kotlin(“测试注释通用”))
实现(“io.mockk:mockk-common:$mockkVersion”)
}
}
getByName(“jvmMain”).dependencies{
实施(kotlin(“stdlib-jdk8”))
}
getByName(“jvmTest”).依赖项{
实施(kotlin(“测试”))
实现(kotlin(“测试junit”))
实现(“io.mockk:mockk:$mockkVersion”)
}
getByName(“jsMain”).dependencies{
实施(kotlin(“stdlib js”))
}
getByName(“jsTest”).dependencies{
实现(kotlin(“测试js”))
}
getByName(“macosMain”).依赖项{
}
getByName(“macosTest”).依赖项{
}
getByName(“windowsMain”).dependencies{
}
getByName(“windowsTest”).依赖项{
}
}
}
源集{
全部{
languageSettings.enableLanguageFeature(“InlineClass”)
}
}
配置(列表(元数据()、jvm()、js()、macosX64(“macos”)、mingwX64(“windows”)){
mavenPublication{
val targetPublication=this@mavenPublication
tasks.withType()
.matching{it.publication==targetPublication}
}
}
}
任务(“generateJsPackageJson”){
多拉斯特{
文件(“$buildDir/js/packages/${project.name}/kotlin”,“package.json”)
.writeText(
"""{
“名称”:“@org/${project.name.toLowerCase()}”,
“版本”:“$version”,
“main”:“${project.name}.js”,
“url”:”https://gitlab.com/org/common/multiplatform/lib",
“依赖项”:{
“kotlin”:“^${kotlin.coreLibrariesVersion}”
},
“publishConfig”:{
“@org:registry”:”https://gitlab.com/api/v4/projects/${System.getenv(“CI_PROJECT_ID”)}/packages/npm/“
}
}
"""
)
}
}
JS上my library的使用者使用GitLab注册表中的npm安装包,tha工作正常。他们遇到的问题如下:
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 DI Kodein DI'
需要堆栈:
-/tmp/test lib/node_modules/@org/lib/Index.js
-
位于Function.Module.\u resolveFilename(internal/modules/cjs/loader.js:965:15)
at Function.Module._load(内部/modules/cjs/loader.js:841:27)
at Module.require(内部/modules/cjs/loader.js:1025:19)
根据需要(内部/modules/cjs/helpers.js:72:18)
at/tmp/test lib/node_modules/@org/lib/Index.js:5:48{
代码:“未找到模块”,
requireStack:[
“/tmp/test lib/node_modules/@org/lib/Index.js”,
''
]
}
如何将对Kodein的依赖关系隐藏到JS客户端?我对gradle依赖关系管理工作原理的理解是,使用实现应该在编译和运行时添加依赖关系,但只针对您的模块,而不针对其外部客户端。
发生这种情况是因为我在库的非内部包和类中使用了KodeIN吗?这是因为KodeIN是Gradle(Maven)依赖项,在NPM注册表中没有显示。 您生成的
package.json
只有Kotlin依赖项,但没有Kodein(您不能这样做,因为我知道,NPM中没有Kodein)
事实上,您需要将其与您的代码一起分发,因为否则,您将得到这样的ReferenceError
例如,您可以将依赖项放入npm包中的node\u模块中
现在我们正在开发基于封闭世界模型的Kotlin/JS IR编译器,它将生成绑定了所有Kotlin库的JavaScript文件(但有可能在这种情况下共享一些库)。您可以在您的项目中尝试它(如果您的依赖项有IR变体)谢谢@ilya,您所说的有道理,但也证实了我对Kotlin MPP瞄准JS的担忧。您可以详细介绍一下吗?例如,您可以将依赖项放入npm包中的node_modules dir中。
?