Publi sh Kotlin Многоплатформенная библиотека Bintray Use Kotlin DSL - PullRequest
3 голосов
/ 20 января 2020

Я написал библиотеку с Kotlin MultiPlatform ( ссылка ). Я могу добавить библиотеку в виде файла jar в проект, но теперь я хочу сделать это с bintray

Я выбрал Link , но у меня возникла проблема

Моя проблема заключалась в том, что значение variableName переменная, которую я давал, Gradle был неправильным для меня:

val publicationName = "MySharedCode"
publishing {
    publications.invoke {
        publicationName(MavenPublication::class) {
            artifactId = artifactID
            artifact(shadowJar)
            pom.addDependencies()
        }
    }
}



   Gradle Sync Error :  Publication with name 'MySharedCode' not found.

My Kotlin Файл DSL Gradle:

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import com.jfrog.bintray.gradle.BintrayExtension
import org.gradle.api.publish.maven.MavenPom
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("multiplatform")
    `maven-publish`
    id("com.jfrog.bintray") version "1.8.4"
    id ("com.github.johnrengelman.shadow") version "5.2.0"
    java
}


val ktorVersion = "1.3.0-rc2"
val serialization = "0.11.0"
val coroutines = "1.2.1"

project.group = "com.my.domain"
project.version = "0.0.3"
val artifactID = "my-shared-lib"

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 = "MySharedCode"
            }
        }
    }

    jvm("android")

    sourceSets["commonMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
        // HTTP
        implementation("io.ktor:ktor-client-core:$ktorVersion")
        implementation("io.ktor:ktor-client-json:$ktorVersion")
        implementation("io.ktor:ktor-client-serialization:$ktorVersion")

        // Coroutines
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines")


    }

    sourceSets["androidMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib")
        // HTTP
        implementation("io.ktor:ktor-client-android:$ktorVersion")
        implementation("io.ktor:ktor-client-json-jvm:$ktorVersion")
        implementation("io.ktor:ktor-client-serialization-jvm:$ktorVersion")

        // Coroutines
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines")
    }
    sourceSets["iosMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib")
        // HTTP
        implementation("io.ktor:ktor-client-ios:$ktorVersion")
        implementation("io.ktor:ktor-client-json-native:$ktorVersion")
        implementation("io.ktor:ktor-client-serialization-iosx64:$ktorVersion")

        // Coroutines
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutines")
    }
}


val packForXcode by tasks.creating(Sync::class) {
    group = "build"

    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val framework = kotlin.targets.getByName<KotlinNativeTarget>("ios").binaries.getFramework(mode)

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

    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)

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

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


val shadowJar: ShadowJar by tasks
shadowJar.apply {
    baseName = artifactID
    classifier = null
}
fun MavenPom.addDependencies() = withXml {
    asNode().appendNode("dependencies").let { depNode ->
        configurations.commonMainImplementation.allDependencies.forEach {
            depNode.appendNode("dependency").apply {
                appendNode("groupId", it.group)
                appendNode("artifactId", it.name)
                appendNode("version", it.version)
            }
        }
    }
}

val publicationName = "MySharedCode"
publishing {


    publications.invoke {
        publicationName(MavenPublication::class) {
            artifactId = artifactID
            artifact(shadowJar)
            pom.addDependencies()
        }
    }
}


fun findProperty(s: String) = project.findProperty(s) as String?
bintray {
    user = "xxxx"
    key = "xxxx"
    publish = true
    setPublications(publicationName)
    pkg(delegateClosureOf<BintrayExtension.PackageConfig> {
        repo = "lib"
        name = "my repo name"
        userOrg = "my user org"
        websiteUrl = "https://my-domain.com/"
        githubRepo = "myRepo"
        vcsUrl = "myRepo url"
        description = "my repo description"
        setLabels("kotlin")
        setLicenses("MIT")
        desc = description
    })
}

tasks {
    withType(GradleBuild::class.java) {
        dependsOn(shadowJar)
    }
    withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }
    withType(Test::class.java) {
        testLogging.showStandardStreams = true
    }
    withType<GenerateMavenPom> {
        destination = file("$buildDir/libs/${shadowJar.name}.pom")
    }
}

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы должны создать скрипт gradle для механизма публикации с помощью bintray и apply, который в build.gradle.kts из MMP области проекта.

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


plugins {
    id("com.android.library")
    id("org.jetbrains.kotlin.multiplatform")
}


apply(from = rootProject.file("publishSystem/publish.gradle"))

//
//
//
//

В следующем выражении это publishLibraryVariants в android расширение в kotlin расширение


kotlin {
   android { publishLibraryVariants("release") }

//
//
//
//

}

0 голосов
/ 21 февраля 2020

Это мой первый раз, когда я увидел "bintray" в Kotlin DSL. Но согласно их документации

bintray {
    user = "xxxx"
    key = "xxxx"
    publish = true
    publications = [publicationName] // this is an array
    pkg {
        repo = "lib"
        name = "my repo name"
        vcsUrl = "myRepo url"
        licenses = ["MIT"]
        version {
            name = "1.0.0"
            desc = "Release one Woraay ^_^"
            released  = new Date()
        }
    }
}

Лично я использую что-то еще с моей стороны. Почему бы тебе не попробовать это?

publishing {
    repositories.maven("https://api.bintray.com/maven/THE REST OF THE URL;publish=1") {
        name = "bintray"

        credentials {
            username = "ADMIN"
            password = "ADMIN"
        }
    }

    publications {
        register("plugin", MavenPublication::class) {
            groupId = "com.example.MySharedCode"
            artifactId = "MySharedCode"
            version = "1.0.0"

            from(components["java"])
        }
    }
}

gradlePlugin {
    plugins {
        create("Gradle-Plugin") {
            this.id = "com.example.MySharedCode"
            this.implementationClass = "com.example.MySharedCode.gradle.MainClassNameHere"
        }
    }
}
...