简体   繁体   English

iOS 依赖项在 Kotlin 多平台项目中未解决

[英]iOS dependences not resolving in Kotlin MultiPlatform Project

I am trying to develop a small library to post issues to my company's Jira server, and I thought that a Kotlin MPP w/ KTOR would be just the ticket.我正在尝试开发一个小型库来将问题发布到我公司的 Jira 服务器,我认为带有 KTOR 的Kotlin MPP 将只是门票。

At first, following a few tutorials, I made a shared project, and the imports for iOS were working fine but Android's Ktor implementation would not resolve.起初,按照一些教程,我做了一个共享项目,iOS 的导入工作正常,但 Android 的 Ktor 实现无法解决。 Then I realized that I needed to recreate the project and create a library instead of a shared application, as I have existing codebases for each mobile client already, and I need to publish the MPP library to be used by them.然后我意识到我需要重新创建项目并创建一个库而不是共享应用程序,因为我已经为每个移动客户端拥有了现有的代码库,并且我需要发布 MPP 库以供他们使用。

Upon recreating the project as a library, and simply starting to add the dependencies for KTOR 1.3.2 , the iOS dependencies are failing to resolve.在将项目重新创建为库并开始添加KTOR 1.3.2的依赖项后,iOS 依赖项无法解决。 This is not just KTOR, it is any iOS dependency, so there's obviously something incorrect in my project setup, but I am unable to spot it.这不仅仅是 KTOR,它是任何 iOS 依赖项,所以我的项目设置中显然有一些不正确的地方,但我无法发现它。

Here is the gradle file:这是 gradle 文件:

plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.3.72'
}

repositories {
    jcenter()
    mavenCentral()
    maven { url "https://kotlin.bintray.com/kotlinx" }
}

group 'com.example.issuereporter'
version '0.0.1'

apply plugin: 'maven-publish'

kotlin {

    targets {
        final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") ? presets.iosArm64 : presets.iosX64

        fromPreset(iOSTarget, 'ios') {
            binaries {
                framework('IssueReporter')
            }
        }


        fromPreset(presets.jvm, 'android')
    }

    def ktor_version = "1.3.2"

    sourceSets["commonMain"].dependencies {
        implementation kotlin('stdlib-common')

        implementation "io.ktor:ktor-client-core:$ktor_version"
        implementation "io.ktor:ktor-client-json:$ktor_version"
        implementation "io.ktor:ktor-client-serialization:$ktor_version"
    }

    sourceSets["commonTest"].dependencies {
        implementation kotlin('test-common')
        implementation kotlin('test-annotations-common')
    }

    sourceSets["androidMain"].dependencies {
        implementation kotlin('stdlib')

        implementation "io.ktor:ktor-client-core-jvm:$ktor_version"
        implementation "io.ktor:ktor-client-json-jvm:$ktor_version"
        implementation "io.ktor:ktor-client-serialization-jvm:$ktor_version"
        implementation "io.ktor:ktor-client-auth-jvm:$ktor_version"

    }

    sourceSets["androidTest"].dependencies {
        implementation kotlin('test')
        implementation kotlin('test-junit')
    }

    sourceSets["iosMain"].dependencies {
        implementation "io.ktor:ktor-client-ios:$ktor_version"
        implementation "io.ktor:ktor-client-core-native:$ktor_version"
        implementation "io.ktor:ktor-client-json-native:$ktor_version"
        implementation "io.ktor:ktor-client-serialization-native:$ktor_version"
    }


}

configurations {
    compileClasspath
}


task packForXcode(type: Sync) {
    final File frameworkDir = new File(buildDir, "xcode-frameworks")
    final String mode = project.findProperty("XCODE_CONFIGURATION")?.toUpperCase() ?: 'DEBUG'
    final def framework = kotlin.targets.ios.binaries.getFramework("IssueReporter", mode)

    inputs.property "mode", mode
    dependsOn framework.linkTask

    from { framework.outputFile.parentFile }
    into frameworkDir

    doLast {
        new File(frameworkDir, 'gradlew').with {
            text = "#!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '${rootProject.rootDir}'\n./gradlew \$@\n"
            setExecutable(true)
        }
    }
}

tasks.build.dependsOn packForXcode

The console output is控制台 output 是

Could not resolve io.ktor:ktor-client-ios:1.3.2.
Could not resolve io.ktor:ktor-client-core-native:1.3.2.
Could not resolve io.ktor:ktor-client-json-native:1.3.2.
Could not resolve io.ktor:ktor-client-serialization-native:1.3.2.

Anything obvious that I am missing here?有什么明显我在这里失踪的吗?

UPDATE更新

I scrapped and recreated the project w/ an updated version of IntelliJ (IntelliJ IDEA 2019.3.5 (Community Edition)) & the Kotlin 1.4.0 Plugin installed.我使用 IntelliJ 的更新版本(IntelliJ IDEA 2019.3.5(社区版))和安装了 Kotlin 1.4.0 插件废弃并重新创建了项目。 This gave me a slightly different creation wizard, and the option to use Kotlin as the Gradle syntax.这给了我一个稍微不同的创建向导,以及使用 Kotlin 作为 Gradle 语法的选项。

Updated build.gradle.kts file:更新build.gradle.kts文件:

plugins {
    kotlin("multiplatform") version "1.4.0"
    kotlin("plugin.serialization") version "1.4.0"
    id("com.android.library")
    id("kotlin-android-extensions")
}
group = "com.example.issuereporter"
version = "1.0-SNAPSHOT"

repositories {
    gradlePluginPortal()
    google()
    jcenter()
    mavenCentral()
    maven(url = "https://kotlin.bintray.com/kotlinx")
    maven(url = "https://dl.bintray.com/kotlin/ktor")
    maven(url = "https://repo1.maven.org/maven2/")
    maven(url = "https://dl.bintray.com/kotlin/kotlin-eap")
    maven(url = "https://plugins.gradle.org/m2/")
}
kotlin {
    android()
    iosX64("ios") {
        binaries {
            framework {
                baseName = "library"
            }
        }
    }

    val ktor_version = "1.3.2"
    val serialization_version = "0.20.0"

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-core:$ktor_version")
                implementation("io.ktor:ktor-client-json:$ktor_version")
                implementation("io.ktor:ktor-client-serialization:$ktor_version")
                implementation("io.ktor:ktor-client-auth:$ktor_version")
                implementation("io.ktor:ktor-client-apache:$ktor_version")

                implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version")
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("androidx.core:core-ktx:1.2.0")

                implementation("io.ktor:ktor-client-android:$ktor_version")
                implementation("io.ktor:ktor-client-auth-jvm:$ktor_version")
                implementation("io.ktor:ktor-client-json-jvm:$ktor_version")
            }
        }
        val androidTest by getting
        val iosMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-ios:$ktor_version")
                implementation ("io.ktor:ktor-client-core-native:$ktor_version")
                implementation("io.ktor:ktor-client-json-native:$ktor_version")
                implementation("io.ktor:ktor-client-auth-native:$ktor_version")
            }
        }
        val iosTest by getting
    }
}
android {
    compileSdkVersion(29)
    defaultConfig {
        minSdkVersion(24)
        targetSdkVersion(29)
        versionCode = 1
        versionName = "1.0"
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
        }
    }
}

The gradle dependencies for iOS successfully sync when I set the ktor_version to 1.3.2 but not for 1.4.0 (assuming the mirrors haven't updated for the native files??)... but the imports don't compile when I attempt to utilize the class at all... see attached image:当我将ktor_version设置为1.3.2但不是1.4.0时,iOS 的 gradle 依赖项成功同步(假设镜像尚未针对本机文件更新??)...但是当我尝试时导入不会编译完全利用 class ......见附图:

在此处输入图像描述

I would guess you don't have enableFeaturePreview("GRADLE_METADATA") in settings.gradle .我猜你在settings.gradle中没有enableFeaturePreview("GRADLE_METADATA")

settings.gradle

Check our starter project KaMPKit for a running example on 1.3.72.查看我们的启动项目KaMPKit以获取 1.3.72 上的运行示例。 We'll probably bump that to 1.4.0 this week, but for now it should be a good reference.我们可能会在本周将它升级到 1.4.0,但现在它应该是一个很好的参考。

Here are my dependencies (I have separate iOS targets, but it should still help you):这是我的依赖项(我有单独的 iOS 目标,但它仍然应该对您有所帮助):

        iosEmulatorMain.dependencies {
            implementation "io.ktor:ktor-client-ios:$ktorVersion"
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutinesVersion"
            implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serializationVersion"
            implementation "com.soywiz.korlibs.klock:klock-iosx64:$klockVersion"
            implementation "com.github.aakira:napier-iosX64:$napierVersion"
        }
        iosDeviceMain.dependencies {
            implementation "io.ktor:ktor-client-ios:$ktorVersion"
            implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutinesVersion"
            implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serializationVersion"
            implementation "com.soywiz.korlibs.klock:klock-iosarm64:$klockVersion"
            implementation "com.github.aakira:napier-iosArm64:$napierVersion"
        }

Versions:版本:

ktorVersion=1.3.2

Repositories:存储库:

    maven(url = "https://kotlin.bintray.com/kotlinx")
    maven(url = "https://dl.bintray.com/kotlin/ktor")
    maven(url = "https://repo1.maven.org/maven2/")
    maven(url = "https://dl.bintray.com/kotlin/kotlin-eap")
    maven(url = "https://plugins.gradle.org/m2/")

To configure client serializer try to write it like this:要配置客户端序列化程序,请尝试这样编写:

install(JsonFeature) {
    serializer = KotlinxSerializer(kotlinx.serialization.json.Json {
        ignoreUnknownKeys = true 
    })
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM