【问题标题】:Linking dependencies with Gradle 6.5 in a Kotlin Multiplatform Multimodule project在 Kotlin 多平台多模块项目中使用 Gradle 6.5 链接依赖项
【发布时间】:2020-06-30 20:09:17
【问题描述】:

我有以下结构,我想在 module-mp-1application-jvm-1 中包含 integration-jvm-1 作为依赖项,我想将 module-mp-1 的 JVM 输出作为依赖项包含在内。

查看 Github 上的示例项目: https://github.com/JVAAS/kotlin-multiplatform-multi-module-setup

以下是我迄今为止所做的概述:

generic-project
  +-- applications
      +-- application-jvm-1
  +-- integrations
      +-- integration-jvm-1
  +-- modules
      +-- module-mp-1
  build.gradle.kts
  settings.gradle.kts

我的build.gradle.kts为空,settings.gradle.kts如下:

rootProject.name = "generic-project"

include("applications:application-jvm-1")
include("modules:module-mp-1")
include("integrations:integration-jvm-1")

pluginManagement {
    repositories {
        mavenCentral()
        gradlePluginPortal()
        maven {
            url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
        }
    }
}

applications/application-jvm-1/build.gradle.kts 如下 (注意api(project(":modules:module-mp-1")) 依赖)

plugins {
    val kotlinVersion = "1.4-M2"
    application
    kotlin("multiplatform") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
}

group = "com.generic.applications"
version = "1.0.0"

repositories {
    jcenter()
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
    maven {
        url = uri("https://kotlin.bintray.com/kotlinx")
    }
    gradlePluginPortal()
}

kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = "11"
        }
    }

    sourceSets {

        val serializationVersion = "0.20.0-1.4-M2"
        val coroutinesVersion = "1.3.7-1.4-M2"

        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
                implementation(kotlin("reflect"))

                api(project(":modules:module-mp-1"))

            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        all {
            languageSettings.enableLanguageFeature("InlineClasses")
        }
    }

}

application {
    mainClassName = "Application"
}

integrations/integration-jvm-1/build.gradle.kts如下:

plugins {
    val kotlinVersion = "1.4-M2"
    kotlin("multiplatform") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
}

group = "com.generic.integrations"
version = "1.0.0"

repositories {
    jcenter()
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
    maven {
        url = uri("https://kotlin.bintray.com/kotlinx")
    }
    gradlePluginPortal()
}

kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = "11"
        }
    }

    sourceSets {

        val serializationVersion = "0.20.0-1.4-M2"
        val coroutinesVersion = "1.3.7-1.4-M2"

        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
                implementation(kotlin("reflect"))

                // logging
                val slf4jVersion = "1.7.25"
                val logbackVersion = "1.2.3"
                implementation("org.slf4j:slf4j-api:$slf4jVersion")
                implementation("org.slf4j:jcl-over-slf4j:$slf4jVersion")
                implementation("org.slf4j:jul-to-slf4j:$slf4jVersion")
                implementation("org.slf4j:log4j-over-slf4j:$slf4jVersion")
                implementation("ch.qos.logback:logback-classic:$logbackVersion")

            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        all {
            languageSettings.enableLanguageFeature("InlineClasses")
        }
    }

}

/modules/module-mp-1/build.gradle.kts 如下: (注意依赖api(project(":integrations:integration-jvm-1"))

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4-M2"
}
group = "com.generic.modules"
version = "1.0.0"

repositories {
    mavenCentral()
    jcenter()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
}
dependencies {
    testImplementation(kotlin("test-junit5"))
    implementation(kotlin("stdlib-jdk8"))

    // ktor
    val ktorVersion = "1.3.1"
    //implementation("io.ktor:ktor-server-netty:$ktorVersion")
    implementation("io.ktor:ktor-server-cio:$ktorVersion")
    implementation("io.ktor:ktor-html-builder:$ktorVersion")
    implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.7.1")

    // logging
    val slf4jVersion = "1.7.25"
    val logbackVersion = "1.2.3"
    implementation("org.slf4j:slf4j-api:$slf4jVersion")
    implementation("org.slf4j:jcl-over-slf4j:$slf4jVersion")
    implementation("org.slf4j:jul-to-slf4j:$slf4jVersion")
    implementation("org.slf4j:log4j-over-slf4j:$slf4jVersion")
    implementation("ch.qos.logback:logback-classic:$logbackVersion")

    api(project(":integrations:integration-jvm-1"))

}
tasks.withType<KotlinCompile>() {
    kotlinOptions.jvmTarget = "11"
}

当我将通用项目拉入 IntelliJ 并进行 gradle 刷新时,我没有收到错误,但是当我在应用程序中使用模块依赖项时,我也无法编译它

import com.generic.modules.Module1 <<-- unresolved reference modules

object Application {

    @JvmStatic
    fun main(args: Array<String>) {

        println("TEST")

        println(Module1().toString())

    }


}

有什么想法吗? 我已经在 Github 上制作了一个示例项目,其中包含以上所有内容 https://github.com/JVAAS/kotlin-multiplatform-multi-module-setup

如果这个目录结构让它变得比它应该的更困难,那么我也很乐意改变它。只希望依赖项以一种或另一种方式工作。

【问题讨论】:

    标签: kotlin gradle gradle-kotlin-dsl kotlin-multiplatform


    【解决方案1】:

    Building Multiplatform Projects with Gradle 是该主题的最佳资源。特别是在Adding Dependencies 它说:

    project('...') 对另一个多平台项目的依赖会自动解析为适当的目标。在源集的依赖项中指定单个 project('...') 依赖项就足够了,并且包含源集的编译将收到该项目的相应平台特定工件,前提是它具有兼容的目标。

    本文还包含有关如何配置项目依赖项的示例。

    【讨论】:

    • Kotlin 文档中有文档真是太酷了,我正在研究 Gradle 文档,其中涵盖了做不相关事情的各种不同方式。今晚让我完成这些文档,谢谢你的链接!
    • 不客气。恕我直言,Kotlin 多平台插件开发人员稍微滥用了 Gradle 的灵活性来实现一个看起来像香草 Gradle 但实际上并非如此的 DSL。这无疑使搜索文档变得困难,因为您不可避免地会在 Gradle 文档中结束并想知道为什么那里描述的内容不适用于 KMP。抱歉吐槽了!
    • 我似乎正在取得进展,但还不是 100%,我在某个地方遗漏了一些小东西来编译它。更新了我的问题并制作了一个github示例项目github.com/JVAAS/kotlin-multiplatform-multi-module-setup
    • 我注意到您没有在modules:module-mp-1 中使用kotlin("multiplatform") 插件,但您的代码在commonMain 中。 commonMain 是由多平台插件声明的源集,kotlin("jvm") 不会将该目录视为源集。您应该明确声明该源集,或者将 commonMaincommonTest 重命名为 maintest
    • 提交了修复上述问题以及其他一些问题的 PR。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2018-11-10
    • 2020-09-05
    相关资源
    最近更新 更多