我正在构建一个kotlin MPP库,目标是JVM,Windows,JS和MacOS。
对于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>'
]
}如何对JS客户端隐藏对Kodein的依赖?我对gradle依赖项管理的工作原理的理解是,使用实现应该在编译和运行时添加依赖项,但只为模块添加依赖项,而不是为其外部客户端添加依赖项。这是不是因为我在Lib的非内部包和类中使用了KodeIN?
发布于 2020-10-28 22:32:44
这是因为Kodein是Gradle (Maven)依赖,这不会出现在NPM注册表中。你生成的package.json只有Kotlin依赖,但没有Kodein (你不能,因为据我所知,NPM中没有Kodein )。
实际上,您需要将其与您的代码一起分发,否则,您将获得这样的ReferenceError
例如,您可以将依赖项放入npm包中的node_modules目录中。
现在我们正在开发Kotlin/JS IR编译器,它基于封闭世界模型,可以生成捆绑了所有Kotlin库的JavaScript文件(但也可以共享一些库)。你可以在你的项目中尝试它(如果你的依赖项有IR变量)
https://stackoverflow.com/questions/64565244
复制相似问题