Gradle同步成功时,Kotlin多平台无法解析引用

时间:2020-05-28 15:11:53

标签: kotlin gradle kotlin-multiplatform

编译我的kotlin跨平台项目时,我在通用模块中使用的内容得到了Unresolved reference。但是gradle同步工作正常。您可以找到我的项目here

详细信息:

  1. 我遵循了Jetbrain to build a mobile multiplatform project中的教程。一切正常。

  2. 然后,我在公共模块内实现了一个ktor客户端,以请求一个api(jsonplaceholder)。我添加了所有必需的依赖项,一切似乎都很好。所有引用均已解决,我没有错误。

  3. 但是当我用make Project编译我的项目时,所有添加到ktor等的依赖项都无法解决。

我想我的项目配置有问题,当我运行./gradlew androidDependencies时,看来SharedCode存在问题,因为有时在命令的输出中将其标记为{ {1}}。

该项目的\--- :SharedCode是:

build.gradle

公用buildscript { ext.kotlin_version = '1.3.71' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:4.0.0-rc01' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 模块的build.gradle.kts是:

SharedCode

Android应用程序的import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget plugins { kotlin("multiplatform") kotlin("plugin.serialization") } kotlin { //select iOS target platform depending on the Xcode environment variables val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget = if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true) ::iosArm64 else ::iosX64 iOSTarget("ios") { binaries { framework { baseName = "SharedCode" } } } jvm("android") val serializationVersion = "0.20.0" val ktorVersion = "1.3.2" sourceSets["commonMain"].dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib-common") implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serializationVersion") implementation("io.ktor:ktor-client-core:$ktorVersion") implementation("io.ktor:ktor-client-json:$ktorVersion") implementation("io.ktor:ktor-client-serialization:$ktorVersion")//Kotlinxserializer } sourceSets["androidMain"].dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib") } } val packForXcode by tasks.creating(Sync::class) { val targetDir = File(buildDir, "xcode-frameworks") /// selecting the right configuration for the iOS /// framework depending on the environment /// variables set by Xcode build val mode = System.getenv("CONFIGURATION") ?: "DEBUG" val framework = kotlin.targets .getByName<KotlinNativeTarget>("ios") .binaries.getFramework(mode) inputs.property("mode", mode) dependsOn(framework.linkTask) from({ framework.outputDirectory }) into(targetDir) /// generate a helpful ./gradlew wrapper with embedded Java path doLast { val gradlew = File(targetDir, "gradlew") gradlew.writeText("#!/bin/bash\n" + "export 'JAVA_HOME=${System.getProperty("java.home")}'\n" + "cd '${rootProject.rootDir}'\n" + "./gradlew \$@\n") gradlew.setExecutable(true) } } tasks.getByName("build").dependsOn(packForXcode) 是:

build.gradle

您知道我在做什么错吗?

我读了Building Multiplatform Projects with Gradle,但没有帮助。

我找到的唯一可行的项目来自KaMPKit。我已经将apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.mpp.mpptest" minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(':SharedCode') } 文件设置为与KaMPKit中的文件一样(请参阅分支build.gradle(.kts)),但是仍然存在“未解决的引用”问题。

1 个答案:

答案 0 :(得分:1)

我解决了我的问题。出现错误是因为我没有声明插件android.lybrary

即使没有必要解决此问题,我也决定将我的build.gradle文件切换到kotlin DLS,我重写了所有build.gradle,并对共享模块进行了以下更改:

  • 我创建了一个AndroidManifest.xml
  • 我添加了com.android.library插件
  • 我添加了一个街区android

最后,共享模块的build.gradle.kts如下所示:

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    kotlin("plugin.serialization")
    id("kotlinx-serialization")
    id("com.android.library")
}

android {
    compileSdkVersion(29)
    defaultConfig {
        minSdkVersion(Versions.min_sdk)
        targetSdkVersion(Versions.target_sdk)
        versionCode = 1
        versionName = "1.0"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
}

kotlin {
    //select iOS target platform depending on the Xcode environment variables
    val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
    if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
    ::iosArm64
    else
    ::iosX64

    iOSTarget("ios") {
        binaries {
            framework {
                baseName = "SharedCode"
            }
        }
    }

    jvm("android")

    sourceSets["commonMain"].dependencies {
        implementation(kotlin("stdlib-common", Versions.kotlin))
        implementation(Deps.Ktor.commonCore)
        implementation(Deps.Ktor.commonJson)
        implementation(Deps.Coroutines.common)
        implementation(Deps.Ktor.commonSerialization)
    }

    sourceSets["androidMain"].dependencies {
        implementation(kotlin("stdlib", Versions.kotlin))
        implementation(Deps.Coroutines.jdk)
        implementation(Deps.Ktor.androidSerialization)
    }

    sourceSets["iosMain"].dependencies {
        implementation(Deps.Ktor.iosSerialization)
    }
}

val packForXcode by tasks.creating(Sync::class) {
    val targetDir = File(buildDir, "xcode-frameworks")

    /// selecting the right configuration for the iOS
    /// framework depending on the environment
    /// variables set by Xcode build
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val framework = kotlin.targets
            .getByName<KotlinNativeTarget>("ios")
            .binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)

    from({ framework.outputDirectory })
    into(targetDir)

    /// generate a helpful ./gradlew wrapper with embedded Java path
    doLast {
        val gradlew = File(targetDir, "gradlew")
        gradlew.writeText("#!/bin/bash\n"
                + "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
                + "cd '${rootProject.rootDir}'\n"
                + "./gradlew \$@\n")
        gradlew.setExecutable(true)
    }
}

tasks.getByName("build").dependsOn(packForXcode)

所有依赖项版本号均来自Dependencies.kt个文件(请参见KaMPKit

所有依赖性现在都已解决。