问题描述
我正在构建针对JVM,Windows,JS和MacOS的kotlin MPP库。
我的gradle文件对于JS来说是这样的
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>'
]
}
如何隐藏对JS客户的Kodein依赖?我对gradle依赖管理的工作方式的理解是,使用实现应该在编译和运行时添加依赖,但仅对您的模块有效,而对外部客户端无效。 这是因为我在Lib的非内部包和类中使用KodeIN吗?
解决方法
这是因为Kodein是Gradle(Maven)依赖项,在NPM注册表中未提供。
您生成的package.json
仅具有Kotlin依赖性,而没有Kodein(并且您不能这样做,因为据我所知,NPM中没有Kodein)。
实际上,您需要将其与代码一起分发,否则,您将获得ReferenceError
例如,您可以将依赖项放入npm软件包中的node_modules
目录中。
现在,我们正在开发基于封闭世界模型的Kotlin / JS IR编译器,该编译器将生成捆绑了所有Kotlin库的JavaScript文件(但有可能共享某些库)。您可以在您的项目中尝试(如果您的依赖项具有IR变体)