icerockdev / moko-resources

Resources access for mobile (android & ios) Kotlin Multiplatform development
https://moko.icerock.dev/
Apache License 2.0
1.07k stars 120 forks source link

Unable to resolve dependency in Kotlin MPP #95

Closed RomeuG closed 4 years ago

RomeuG commented 4 years ago

Hello.

I am trying to integrate this library into a project and in iOS, Gradle gives the following error:

Could not determine the dependencies of task ':project:linkDebugFrameworkIosArm32'.
> Could not resolve all task dependencies for configuration ':project:iosArm32CompileKlibraries'.
   > Could not resolve dev.icerock.moko:resources:0.11.0.
     Required by:
         project :project
      > Unable to find a matching variant of dev.icerock.moko:resources:0.11.0:
          - Variant 'android-debugApiElements' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.platform.type 'native' and found incompatible value 'androidJvm'.
              - Other attributes:
                  - Found com.android.build.api.attributes.BuildTypeAttr 'debug' but wasn't required.
                  - Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
                  - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'java-api'.
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' but no value provided.
          - Variant 'android-debugRuntimeElements' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.platform.type 'native' and found incompatible value 'androidJvm'.
              - Other attributes:
                  - Found com.android.build.api.attributes.BuildTypeAttr 'debug' but wasn't required.
                  - Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
                  - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'java-runtime'.
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' but no value provided.
          - Variant 'android-releaseApiElements' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.platform.type 'native' and found incompatible value 'androidJvm'.
              - Other attributes:
                  - Found com.android.build.api.attributes.BuildTypeAttr 'release' but wasn't required.
                  - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
                  - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'java-api'.
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' but no value provided.
          - Variant 'android-releaseRuntimeElements' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.platform.type 'native' and found incompatible value 'androidJvm'.
              - Other attributes:
                  - Found com.android.build.api.attributes.BuildTypeAttr 'release' but wasn't required.
                  - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
                  - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'java-runtime'.
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' but no value provided.
          - Variant 'iosArm64-api' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' and found incompatible value 'ios_arm64'.
              - Other attributes:
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'kotlin-api'.
                  - Required org.jetbrains.kotlin.platform.type 'native' and found compatible value 'native'.
          - Variant 'iosX64-api' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' and found incompatible value 'ios_x64'.
              - Other attributes:
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'kotlin-api'.
                  - Required org.jetbrains.kotlin.platform.type 'native' and found compatible value 'native'.
          - Variant 'metadata-api' capability dev.icerock.moko:resources:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.platform.type 'native' and found incompatible value 'common'.
              - Other attributes:
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'kotlin-api'.
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' but no value provided.
   > Could not resolve dev.icerock.moko:resources-iosarm64:0.11.0.
     Required by:
         project :project
      > Unable to find a matching variant of dev.icerock.moko:resources-iosarm64:0.11.0:
          - Variant 'iosArm64-api' capability dev.icerock.moko:resources-iosarm64:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.native.target 'ios_arm32' and found incompatible value 'ios_arm64'.
              - Other attributes:
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'kotlin-api'.
                  - Required org.jetbrains.kotlin.platform.type 'native' and found compatible value 'native'.
          - Variant 'metadata-api' capability dev.icerock.moko:resources-iosarm64:0.11.0:
              - Incompatible attribute:
                  - Required org.jetbrains.kotlin.platform.type 'native' and found incompatible value 'common'.
              - Other attributes:
                  - Found org.gradle.status 'release' but wasn't required.
                  - Required org.gradle.usage 'kotlin-api' and found compatible value 'kotlin-api'.

My Gradle file, although being in Groovy, it seems to be pretty much correct?

apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.multiplatform'
apply plugin: 'kotlinx-serialization'
apply plugin: 'org.jetbrains.kotlin.native.cocoapods'
apply plugin: "dev.icerock.mobile.multiplatform-resources"

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
    }

    sourceSets {
        main {
            setRoot('src/androidMain')
        }
        release {
            setRoot('src/androidMainRelease')
        }
        debug {
            setRoot('src/androidMainDebug')
        }
        test {
            setRoot('src/androidUnitTest')
        }
        testRelease {
            setRoot('src/androidUnitTestRelease')
        }
        testDebug {
            setRoot('src/androidUnitTestDebug')
        }
    }
}

kotlin {

    version = "0.0.1"

    android("android")

    targets {
        final def buildForDevice = project.findProperty("kotlin.native.cocoapods.target") == "ios_arm"
        if (buildForDevice) {
            iosArm64("iosArm64")
            iosArm32("iosArm32")
        } else {
            iosX64("ios")
        }
    }

    sourceSets {
        commonMain {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

                implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"

                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"

                // resources
                implementation "dev.icerock.moko:resources:$moko_resources_version"
            }
        }

        androidMain {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

                implementation "io.ktor:ktor-client-android:$ktor_version"
                implementation "io.ktor:ktor-client-okhttp:$ktor_version"
                implementation "io.ktor:ktor-client-serialization-jvm:$ktor_version"

                implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version"

                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
            }
        }

        iosMain {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutines_version"
                implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version"

                // resources
                implementation "dev.icerock.moko:resources-iosarm64:$moko_resources_version"
            }
        }

        iosArm32Main {
            dependsOn iosMain
        }

        iosArm64Main {
            dependsOn iosMain
        }
    }

    cocoapods {
        //version = "0.1.0" // Defaults to "1.0.0-LOCAL"
        homepage = "www.example.com"  // Default to empty
        summary = "..." // Defaults to empty
        frameworkName = "project"
    }

}

multiplatformResources {
    multiplatformResourcesPackage = "com.project.app"
    //iosBaseLocalizationRegion = "en" //optional, default "en"
    //multiplatformResourcesSourceSet = "commonClientMain"  // optional, default "commonMain"
}

I also have enableFeaturePreview("GRADLE_METADATA") in my settings.gradle, removing it causes some problems. Also, it works well on Android.

Any clues?

Thanks

RomeuG commented 4 years ago

Fixed.

It seems that changing the ios project related stuff to this

// ios
    if (project.findProperty("kotlin.native.cocoapods.target") == "ios_arm") {
        iosArm64('ios') {
            binaries {
                framework('Common')
            }
        }
    } else {
        iosX64('ios') {
            binaries {
                framework('Common')
            }
        }
    }

and adding an xcode packing task:

task packForXcode {
    def buildType = project.findProperty("kotlin.build.type") ?: "DEBUG"
    def target = project.findProperty("kotlin.target") ?: "ios"
    def framework = kotlin.targets."$target".compilations
            .main.target.binaries.findFramework("Common", buildType)

    dependsOn framework.linkTask

    doLast {
        copy {
            from framework.outputFile.parent
            into framework.outputFile.parentFile
            include 'data.framework/**'
            include 'data.framework.dSYM'
        }
    }
}

Fixed the issue.