Search code examples
androidkotlingradleandroid-gradle-plugingradle-kotlin-dsl

Publishing Android Kotlin library along with source code


I want to publish a library with source code.

My library project structure

:library:
└── src
    └── main
        └── kotlin
            └── <package>
                └── MyLibrary.kt

gradle.kts

plugins {
   ...
   id("maven-publish")
}

android {
   ...
   // sourceSets{} block is not present as new AGP automatically recognises "src/main/kotlin" as kotlin source
   ...
}

project.afterEvaluate {
    publishing {
        publications {
            register<MavenPublication>("release") {
                groupId = mGroupId
                artifactId = mArtifactId
                version = mVersion

                from(components["release"])
                artifact(tasks.getByName("androidReleaseSourcesJar"))
            }
        }
    }
}

tasks.register("androidReleaseSourcesJar", Jar::class) {
    archiveClassifier.set("sources")

    // Can't refer to `kotlin.srcDirs` but `java.srcDirs` works fine
    from(android.sourceSets["release"].kotlin.srcDirs)
}

I'm getting error at line

from(android.sourceSets["release"].kotlin.srcDirs)

How do I get the reference to all the sourceSet(kotlin + java), if not then only kotlin?

AGP Version: 7.1.0-beta01


Solution

  • The solution I figured out was

    kotlin.sourceSets["main"].kotlin.srcDirs
    

    for publishing kotlin source. If you need to do combination of multiple source for a variant, you will need to do something like

    kotlin.sourceSets["main"].kotlin.srcDirs + kotlin.sourceSets["debug"].kotlin.srcDirs
    

    final output

    tasks.register("androidReleaseSourcesJar", Jar::class) {
        archiveClassifier.set("sources")
        from(kotlin.sourceSets["main"].kotlin.srcDirs)
    }
    

    Verified on AGP:7.1.0-beta01 & Gradle: 7.3.3