diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 85cb16b6..39c64f54 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -46,7 +46,7 @@ jobs: - name: Deploy Snapshot uses: gradle/gradle-build-action@v2 with: - arguments: publishSnapshot --stacktrace + arguments: publishSnapshot --no-configuration-cache --stacktrace env: - SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} - SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} \ No newline at end of file + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} \ No newline at end of file diff --git a/RELEASING.md b/RELEASING.md index ef3cdf05..909583cc 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -6,7 +6,7 @@ 6. `git add .` 7. `git commit -am "Prepare for release X.Y.Z"` 8. `./publish.sh`. -9. Close and release on [Sonatype](https://s01.oss.sonatype.org/#stagingRepositories). +9. Close and release on [Maven Central](https://central.sonatype.com/publishing). 10. `git push origin main` 11. Release on GitHub: 1. Create a new release [here](https://github.com/ansman/auto-dagger/releases/new). diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 35a30522..744346b2 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -34,6 +34,6 @@ dependencies { api(libs.dokka.gradlePlugin) api(libs.testLogger) api(libs.kotlin.jvm.gradle) - api(libs.sonatypePublishFix) api(libs.ksp.gradlePlugin) + api(libs.gradleMavenPublish) } \ No newline at end of file diff --git a/build-logic/src/main/kotlin/dokka-common.gradle.kts b/build-logic/src/main/kotlin/dokka-common.gradle.kts index 9aefd993..a9c160fc 100644 --- a/build-logic/src/main/kotlin/dokka-common.gradle.kts +++ b/build-logic/src/main/kotlin/dokka-common.gradle.kts @@ -1,13 +1,36 @@ + import com.google.devtools.ksp.gradle.KspAATask +import org.gradle.accessors.dm.LibrariesForLibs +import org.jetbrains.dokka.gradle.tasks.DokkaGenerateTask +import se.ansman.dagger.auto.gradle.execWithOutput +import se.ansman.dagger.auto.gradle.mapNullable plugins { id("org.jetbrains.dokka") id("org.jetbrains.dokka-javadoc") } +val libs = the() + +fun repo(path: String = "") = "https://github.com/ansman/auto-dagger$path" + +val gitCommit = project + .execWithOutput { + commandLine("git", "rev-parse", "HEAD") + workingDir = project.rootDir + } + .map { it.trim() } + +val remoteSource: Provider = providers.gradleProperty("version") + .mapNullable { version -> version.takeUnless { it.endsWith("-SNAPSHOT") } } + .orElse(gitCommit) + .map { repo("/blob/$it") } + dokka { + val projectPath = project.path.removePrefix(":").replace(':', '/') dokkaSourceSets.configureEach { suppressGeneratedFiles = true + reportUndocumented = false tasks.withType().configureEach { suppressedFiles.from(fileTree(kspConfig.outputBaseDir)) } @@ -15,5 +38,23 @@ dokka { matchingRegex = "hilt_aggregated_deps*" suppress = true } + + sourceLink { + localDirectory.set(project.file("src/main/kotlin")) + remoteUrl.set(remoteSource.map { remoteSource -> + uri("$remoteSource/$projectPath/src/main/kotlin") + }) + remoteLineSuffix.set("#L") + } } +} + +tasks.withType().configureEach { + mustRunAfter(tasks.withType()) +} + +pluginManager.withPlugin("com.android.library") { + dependencies { + dokkaPlugin(libs.dokka.androidDocumentationPlugin) + } } \ No newline at end of file diff --git a/build-logic/src/main/kotlin/library.publishing.gradle.kts b/build-logic/src/main/kotlin/library.publishing.gradle.kts index 8c5692ea..f3e4610d 100644 --- a/build-logic/src/main/kotlin/library.publishing.gradle.kts +++ b/build-logic/src/main/kotlin/library.publishing.gradle.kts @@ -1,48 +1,17 @@ -import com.android.build.gradle.LibraryExtension -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.gradle.accessors.dm.LibrariesForLibs -import se.ansman.dagger.auto.gradle.execWithOutput -import se.ansman.dagger.auto.gradle.mapNullable +import com.vanniktech.maven.publish.AndroidSingleVariantLibrary +import com.vanniktech.maven.publish.JavadocJar +import com.vanniktech.maven.publish.KotlinJvm +import com.vanniktech.maven.publish.SonatypeHost plugins { - id("maven-publish") - id("signing") id("dokka-common") - id("se.ansman.sonatype-publish-fix") + id("com.vanniktech.maven.publish") + id("signing") } -val libs = the() - -val gitCommit = project - .execWithOutput { - commandLine("git", "rev-parse", "HEAD") - workingDir = project.rootDir - } - .map { it.trim() } - - fun repo(path: String = "") = "https://github.com/ansman/auto-dagger$path" -val remoteSource: Provider = providers.gradleProperty("version") - .mapNullable { version -> version.takeUnless { it.endsWith("-SNAPSHOT") } } - .orElse(gitCommit) - .map { repo("/blob/$it") } - -dokka { - val projectPath = project.path.removePrefix(":").replace(':', '/') - dokkaSourceSets.configureEach { - reportUndocumented.set(false) - sourceLink { - localDirectory.set(project.file("src/main/kotlin")) - remoteUrl.set(remoteSource.map { remoteSource -> - uri("$remoteSource/$projectPath/src/main/kotlin") - }) - remoteLineSuffix.set("#L") - } - } -} - tasks.withType().configureEach { doLast { with(publication) { @@ -51,60 +20,23 @@ tasks.withType().configureEach { } } -val publishing: PublishingExtension = extensions.getByType() +val signArtifacts = providers.gradleProperty("signArtifacts").orNull?.toBooleanStrict() ?: false +mavenPublishing { + val version = providers.gradleProperty("version").get() + publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) -with(publishing) { - repositories.maven { - name = "mavenCentral" - setUrl("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") - credentials { - username = providers.gradleProperty("sonatype.s01.oss.sonatype.org.username") - .orElse(providers.environmentVariable("SONATYPE_USERNAME")) - .orNull - password = providers.gradleProperty("sonatype.s01.oss.sonatype.org.password") - .orElse(providers.environmentVariable("SONATYPE_PASSWORD")) - .orNull - } + if (signArtifacts) { + signAllPublications() } - repositories.maven { - name = "sonatypeSnapshots" - setUrl("https://s01.oss.sonatype.org/content/repositories/snapshots/") - credentials { - username = providers.gradleProperty("sonatype.s01.oss.sonatype.org.username") - .orElse(providers.environmentVariable("SONATYPE_USERNAME")) - .orNull - password = providers.gradleProperty("sonatype.s01.oss.sonatype.org.password") - .orElse(providers.environmentVariable("SONATYPE_PASSWORD")) - .orNull - } - } -} - -tasks.register("publishSnapshot") { - if (providers.gradleProperty("version").get().endsWith("-SNAPSHOT")) { - dependsOn("publishAllPublicationsToSonatypeSnapshotsRepository") - } -} - -val javadocJar by tasks.registering(Jar::class) { - from(tasks.dokkaGeneratePublicationJavadoc) - archiveClassifier.set("javadoc") -} - -val sourcesJar by tasks.registering(Jar::class) { - archiveClassifier.set("sources") -} - -val publication = publishing.publications.register("autoDagger") { - groupId = rootProject.group as String - artifactId = project.path - .removePrefix(":third-party") - .removePrefix(":") - .replace(':', '-') - version = providers.gradleProperty("version").get() - artifact(sourcesJar) - artifact(javadocJar) + coordinates( + groupId = rootProject.group as String, + artifactId = project.path + .removePrefix(":third-party") + .removePrefix(":") + .replace(':', '-'), + version = version, + ) pom { val moduleName = project.path .removePrefix(":third-party") @@ -137,81 +69,43 @@ val publication = publishing.publications.register("autoDagger } } - -if (findProperty("signArtifacts")?.toString()?.toBoolean() == true) { +if (signArtifacts) { signing { useGpgCmd() - sign(publication.get()) } } -pluginManager.withPlugin("com.android.library") { - extensions.configure { - publishing { - singleVariant("release") - } +tasks.register("publishSnapshot") { + if (providers.gradleProperty("version").get().endsWith("-SNAPSHOT")) { + dependsOn("publishAllPublicationsToMavenCentralRepository") } +} - publication { - afterEvaluate { - from(components["release"]) - } +pluginManager.withPlugin("com.android.library") { + mavenPublishing { + configure(AndroidSingleVariantLibrary(sourcesJar = true, publishJavadocJar = false)) } - sourcesJar { - // This is a "hack" to avoid Android from including generated sources - from( - files("src/main").asFileTree.matching( - PatternSet().include( - "**/*.java", - "**/*.kt", - ) - ) - ) + val javadocJar by tasks.registering(Jar::class) { + from(tasks.dokkaGeneratePublicationJavadoc) + archiveClassifier.set("javadoc") } -} -pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { - publication { - afterEvaluate { - if (pluginManager.hasPlugin("com.gradleup.shadow")) { - from(components["shadow"]) - } else { - from(components["java"]) - } + publishing { + publications.withType().configureEach { + artifact(javadocJar) } } - - sourcesJar { - dependsOn("classes") - from(project.extensions.getByType().getByName("main").allSource) - } } -pluginManager.withPlugin("com.gradleup.shadow") { - val compileShaded: Configuration by configurations.creating - configurations.named("compileOnly") { extendsFrom(compileShaded) } - configurations.named("testRuntimeOnly") { extendsFrom(compileShaded) } - configurations.named("shadow") { extendsFrom(configurations["implementation"]) } - - // Since we change the classifier of the shadowJar we need to disable the default jar task or we'll get two - // artifacts that have the same classifier - tasks.named("jar") { - archiveClassifier.set("ignored") - } - - tasks.named("shadowJar") { - archiveClassifier.set("") - configurations = listOf(compileShaded) - isEnableRelocation = true - relocationPrefix = "se.ansman.dagger.auto${project.path.replace(':', '.').replace('-', '_')}" - mergeServiceFiles() - } - - pluginManager.withPlugin("org.gradle.java-test-fixtures") { - configurations.named("testFixturesImplementation") { extendsFrom(compileShaded) } - configurations.named("testFixturesImplementation") { extendsFrom(configurations["implementation"]) } - configurations.named("testFixturesApi") { extendsFrom(configurations["api"]) } +pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { + mavenPublishing { + configure( + KotlinJvm( + javadocJar = JavadocJar.Dokka(tasks.dokkaGeneratePublicationJavadoc.name), + sourcesJar = true + ) + ) } } diff --git a/gradle.properties b/gradle.properties index 95696677..5263f263 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,5 +13,5 @@ ksp.useKSP2=true android.useAndroidX=true -version=2.1.0-SNAPSHOT -latestRelease=2.0.0 +version=2.0.1 +latestRelease=2.0.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f2045580..8713a7e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,6 +34,7 @@ kotlin-metadata = { module = "org.jetbrains.kotlin:kotlin-metadata-jvm", version dokka-gradlePlugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } dokka-versioningPlugin = { module = "org.jetbrains.dokka:versioning-plugin", version.ref = "dokka" } dokka-allModulesPagePlugin = { module = "org.jetbrains.dokka:all-modules-page-plugin", version.ref = "dokka" } +dokka-androidDocumentationPlugin= { module = "org.jetbrains.dokka:android-documentation-plugin", version.ref = "dokka" } okio = "com.squareup.okio:okio:3.11.0" @@ -89,7 +90,7 @@ projectAccessors = { module = "co.hinge.gradle.project-accessors:project-accesso ktorfit = "de.jensklingenberg.ktorfit:ktorfit-lib:2.5.1" ktorfit-ksp = "de.jensklingenberg.ktorfit:ktorfit-ksp:2.5.1" -sonatypePublishFix = "se.ansman.sonatype-publish-fix:gradle-plugin:1.0.0" +gradleMavenPublish = "com.vanniktech.maven.publish:com.vanniktech.maven.publish.gradle.plugin:0.31.0" [bundles] compileTesting = ["compileTesting", "compileTesting-ksp"]