提问者:小点点

当gradle同步成功时,静态编程语言多平台无法解析引用


当我编译我的kotlin多平台项目时,我得到了关于我在公共模块中使用的东西的未解析参考。但是gradle同步工作得很好。你可以在这里找到我的项目

在细节方面:

>

  • 我按照Jetbrain的教程构建了一个移动多平台项目。一切正常。

    然后我在公共模块中实现了一个ktor客户端来请求一个api(json占位符)。我添加了所有必需的依赖项,一切似乎都很好。所有引用都解决了,我没有错误。

    当我运行时,我想我的项目的配置有问题。/gradlew android依赖似乎SharedCode有问题,因为它有时会在命令的输出中标记为\---: SharedCode.

    构建。本项目的等级为:

    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
    }
    

    构建。格拉德尔。通用SharedCode模块的kts为:

    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)
    

    以及构建。android应用程序的gradle是:

    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')
    }
    

    你知道我做错了什么吗?

    我读过与Gradle一起构建多平台项目的文章,但没有任何帮助。

    我发现的唯一有效的项目是来自KaMPKit的。我已经设置了我的构建。gradle(.kts)文件在KaMPKit中的状态(请参见分支将_build_gradle_设置为_KaMPKit),但“未解决的引用”问题仍然存在。


  • 共1个答案

    匿名用户

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

    即使没有必要修复这个问题,我也决定切换我的构建。gradle文件到kotlin DLS,我重写了所有的构建。gradle和我对共享模块做了以下更改:

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

    最后,构建。格拉德尔。共享模块的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)
    

    所有依赖项版本号都来自依赖项。kt文件(请参见KaMPKit)

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