如何在Kotlin/Native中构建kotlinx.coroutines(测试版本0.23.4-native-1)

How to build kotlinx.coroutines in Kotlin/Native (test version 0.23.4-native-1)

这个问题是这个话题的延续: https://github.com/Kotlin/kotlinx.coroutines/issues/246#issuecomment-407023156

我正在尝试在 Kotlin/Native 项目中使用 org.jetbrains.kotlinx:kotlinx-coroutines-core-native:0.23.4-native-1,目标是 iOS。

build.gradle:

buildscript {
    repositories {
        mavenCentral()
        maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" }
    }

    dependencies {
        classpath 'org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.8'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.51"
    }
}

apply plugin: 'kotlin-platform-native'

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

sourceSets {
    main {
        component {
            target 'ios_arm32', 'ios_arm64', 'ios_x64'
            outputKinds = [KLIBRARY]
        }
    }
}

dependencies {
    expectedBy project(':common')
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:0.23.4-native-1"
}

kotlinx:kotlinx-coroutines-core-native 依赖项似乎不起作用,因为会产生如下构建错误:

error: unresolved reference: coroutines
import kotlinx.coroutines.experimental.*
               ^

如果我手动包含 org.jetbrains.kotlinx:kotlinx-coroutines-core-native_release_ios_x64:0.10.3-native 等工件依赖项,则会出现编译器异常:

exception: java.lang.IllegalStateException: Could not find "atomicfu-native"

此错误仍然存​​在,即使我也添加了 org.jetbrains.kotlinx:atomicfu-native:0.10.3-native 依赖项。

这是要检查的事项列表(我已经完成了这个,并最终成功了):

  • 启用 Gradle 元数据。需要检索协程依赖项。为此,请在 "settings.gradle" 文件中添加此行,在所有 "include" 说明之后:

    enableFeaturePreview('GRADLE_METADATA')
    
  • 使用gradle 4.7(较新的版本与当前协程库的元数据不兼容,它们需要 0.4 版本的东西,而当前发布的版本使用 0.3)

  • 在 iOS 模块中:

    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:0.23.4-native-1"
    
  • 在您的公共模块中:

    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.23.4"
    
  • 如果您有 js 模块,由于 gradle 元数据功能,它可能会失败。您可以通过在每个 "repositories" 块 (https://github.com/srs/gradle-node-plugin/issues/301)

    之前添加它来修复它
    repositories.whenObjectAdded {
        if (it instanceof IvyArtifactRepository) {
            metadataSources {
                artifact()
            }
        }
    }
    

希望这就够了!