diff --git a/build.gradle.kts b/build.gradle.kts index cc6b6b0..cbd9fe6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import com.gradleup.librarian.gradle.Librarian plugins { alias(libs.plugins.kgp).apply(false) alias(libs.plugins.ksp).apply(false) - alias(libs.plugins.gratatouille.wiring).apply(false) + alias(libs.plugins.gratatouille).apply(false) alias(libs.plugins.librarian).apply(false) alias(libs.plugins.nmcp).apply(false) alias(libs.plugins.compat).apply(false) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 044d1fe..571ee4c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] kgp = "2.2.20" ksp = "2.3.2" -gratatouille-runtime = "0.1.3" -gratatouille-plugin = "0.1.3" +gratatouille-runtime = "0.2.0" +gratatouille-plugin = "0.2.0" [libraries] json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1" @@ -14,14 +14,14 @@ kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test" } xmlutil = "io.github.pdvrieze.xmlutil:serialization:0.91.1" kgp = { module = "org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin", version.ref = "kgp" } coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2" -gratatouille-wiring-runtime = { module = "com.gradleup.gratatouille:gratatouille-wiring-runtime", version.ref = "gratatouille-runtime" } +gratatouille-runtime = { module = "com.gradleup.gratatouille:gratatouille-runtime", version.ref = "gratatouille-runtime" } gratatouille-tasks-runtime = { module = "com.gradleup.gratatouille:gratatouille-tasks-runtime", version.ref = "gratatouille-runtime" } [plugins] kgp = { id = "org.jetbrains.kotlin.jvm", version.ref = "kgp" } serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kgp" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } -gratatouille-wiring = { id = "com.gradleup.gratatouille.wiring", version.ref = "gratatouille-plugin" } +gratatouille = { id = "com.gradleup.gratatouille", version.ref = "gratatouille-plugin" } librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-6898196f1f9759091ae6fa9bbe84154ec28a9331" } nmcp = { id = "com.gradleup.nmcp", version = "1.3.0" } compat = { id = "com.gradleup.compat.patrouille", version = "0.0.1-SNAPSHOT-9da44b3b93e36a196ae5afc9f7a79a46a82763cd" } diff --git a/nmcp-tasks/build.gradle.kts b/nmcp-tasks/build.gradle.kts index fcabb02..b1a6060 100644 --- a/nmcp-tasks/build.gradle.kts +++ b/nmcp-tasks/build.gradle.kts @@ -10,12 +10,7 @@ plugins { Librarian.module(project) gratatouille { - codeGeneration { - addDependencies.set(false) - classLoaderIsolation { - configurationName.set("nmcpTasks") - } - } + configurationName.set("nmcpTasks") } dependencies { diff --git a/nmcp/api/nmcp.api b/nmcp/api/nmcp.api index c71f1cf..d016591 100644 --- a/nmcp/api/nmcp.api +++ b/nmcp/api/nmcp.api @@ -16,24 +16,34 @@ public abstract interface class nmcp/NmcpAggregationExtension { public abstract fun publishAllProjectsProbablyBreakingProjectIsolation ()V } -public abstract class nmcp/NmcpAggregationPlugin : org/gradle/api/Plugin { - public fun ()V - public synthetic fun apply (Ljava/lang/Object;)V - public fun apply (Lorg/gradle/api/Project;)V -} - public abstract interface class nmcp/NmcpExtension { public abstract fun extraFiles (Ljava/lang/Object;)V public abstract fun publishAllPublicationsToCentralPortal (Lorg/gradle/api/Action;)V } -public abstract class nmcp/NmcpPlugin : org/gradle/api/Plugin { +public abstract interface class nmcp/NmcpSettings { + public abstract fun centralPortal (Lorg/gradle/api/Action;)V +} + +public abstract class nmcp/internal/DefaultNmcpAggregationExtensionPlugin : org/gradle/api/Plugin { public fun ()V public synthetic fun apply (Ljava/lang/Object;)V public fun apply (Lorg/gradle/api/Project;)V } -public abstract class nmcp/NmcpSettingsPlugin : org/gradle/api/Plugin { +public abstract class nmcp/internal/DefaultNmcpExtensionPlugin : org/gradle/api/Plugin { + public fun ()V + public synthetic fun apply (Ljava/lang/Object;)V + public fun apply (Lorg/gradle/api/Project;)V +} + +public abstract class nmcp/internal/DefaultNmcpSettings : nmcp/NmcpSettings { + public fun (Lorg/gradle/api/initialization/Settings;)V + public fun centralPortal (Lorg/gradle/api/Action;)V + public abstract fun getObjects ()Lorg/gradle/api/model/ObjectFactory; +} + +public abstract class nmcp/internal/DefaultNmcpSettingsPlugin : org/gradle/api/Plugin { public fun ()V public synthetic fun apply (Ljava/lang/Object;)V public fun apply (Lorg/gradle/api/initialization/Settings;)V diff --git a/nmcp/build.gradle.kts b/nmcp/build.gradle.kts index e20d956..57d29d5 100644 --- a/nmcp/build.gradle.kts +++ b/nmcp/build.gradle.kts @@ -3,21 +3,19 @@ import com.gradleup.librarian.gradle.Librarian plugins { alias(libs.plugins.kgp) alias(libs.plugins.ksp) - id("com.gradleup.gratatouille.wiring") + id("com.gradleup.gratatouille") } Librarian.module(project) gratatouille { - codeGeneration { - addDependencies.set(false) - } + addDependencies = false pluginLocalPublication("com.gradleup.nmcp.settings") } dependencies { gratatouille(project(":nmcp-tasks")) compileOnly(libs.gradle.min) - implementation(libs.gratatouille.wiring.runtime) + implementation(libs.gratatouille.runtime) testImplementation(libs.kotlin.test) } diff --git a/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt b/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt index 2542a78..872dc4d 100644 --- a/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt @@ -18,13 +18,22 @@ interface NmcpAggregationExtension { * * This function is not compatible with breaking project isolation. To be compatible with project isolation, * add each subproject to the `nmcpAggregation` configuration dependencies. + * + * This was provided as a helper function but indirectly encouraged using non-project isolation compatible practices. + * + * Moving forward, use the `com.gradleup.nmcp.settings` or make a convention plugin that applies `com.gradleup.nmcp` + * to all your projects. */ + @Deprecated("Use the settings plugin or a convention plugin instead") fun publishAllProjectsProbablyBreakingProjectIsolation() /** - * [allFiles] contains all the files present in the "nmcpAggregation" configuration + * [allFiles] contains all the files present in the "nmcpAggregation" configuration. + * + * This [FileCollection] is a multi-rooted [org.gradle.api.file.FileTree] containing only files. * - * This [FileCollection] is a multi-rooted [org.gradle.api.file.FileTree] containing only files + * [allFiles] may be used to publish manually to other repositories than Maven Central, such as Google Cloud + * Storage and or AWS S3. */ val allFiles: FileCollection } diff --git a/nmcp/src/main/kotlin/nmcp/NmcpSettings.kt b/nmcp/src/main/kotlin/nmcp/NmcpSettings.kt new file mode 100644 index 0000000..10b943a --- /dev/null +++ b/nmcp/src/main/kotlin/nmcp/NmcpSettings.kt @@ -0,0 +1,15 @@ +package nmcp + +import org.gradle.api.Action +import org.gradle.api.file.FileCollection + +interface NmcpSettings { + /** + * Configures publishing to central portal releases (Maven Central) and central portal snapshots. + * + * Adds the following tasks: + * - nmcpPublishAggregationToCentralPortal + * - nmcpPublishAggregationToCentralPortalSnapshots + */ + fun centralPortal(action: Action) +} diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt index af4167b..90ad2b2 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt @@ -1,11 +1,15 @@ package nmcp.internal +import gratatouille.GExtension +import gratatouille.GPlugin import nmcp.CentralPortalOptions import nmcp.NmcpAggregationExtension +import nmcp.nmcpAggregationExtensionName import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.file.FileCollection +@GExtension(pluginId = "com.gradleup.nmcp.aggregation", publicType = NmcpAggregationExtension::class, extensionName = nmcpAggregationExtensionName) internal abstract class DefaultNmcpAggregationExtension(private val project: Project) : NmcpAggregationExtension { private val spec = project.objects.newInstance(CentralPortalOptions::class.java) @@ -30,6 +34,7 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro action.execute(spec) } + @Deprecated("Use the settings plugin or a convention plugin instead") override fun publishAllProjectsProbablyBreakingProjectIsolation() { check(project === project.rootProject) { "publishAllProjectsProbablyBreakingProjectIsolation() must be called from root project" diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt index b6d0e1b..8985f7c 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt @@ -1,16 +1,18 @@ package nmcp.internal -import gratatouille.wiring.capitalizeFirstLetter +import gratatouille.GExtension +import gratatouille.capitalizeFirstLetter import nmcp.CentralPortalOptions import nmcp.NmcpExtension import nmcp.internal.task.registerCleanupDirectoryTask +import nmcp.nmcpExtensionName import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication +@GExtension(pluginId = "com.gradleup.nmcp", publicType = NmcpExtension::class, extensionName = nmcpExtensionName) internal abstract class DefaultNmcpExtension(private val project: Project): NmcpExtension { - private var centralPortalConfigured = false private val m2Dir = project.layout.buildDirectory.file("nmcp/m2") private val spec = project.objects.newInstance(CentralPortalOptions::class.java) diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpSettings.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpSettings.kt new file mode 100644 index 0000000..9a95683 --- /dev/null +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpSettings.kt @@ -0,0 +1,49 @@ +package nmcp.internal + +import gratatouille.GExtension +import javax.inject.Inject +import nmcp.CentralPortalOptions +import nmcp.NmcpAggregationExtension +import nmcp.NmcpSettings +import org.gradle.api.Action +import org.gradle.api.initialization.Settings +import org.gradle.api.model.ObjectFactory + +@Suppress("UnstableApiUsage") +@GExtension(pluginId = "com.gradleup.nmcp.settings", extensionName = "nmcpSettings", publicType = NmcpSettings::class) +abstract class DefaultNmcpSettings(settings: Settings): NmcpSettings { + @get:Inject + abstract val objects: ObjectFactory + + private val spec = objects.newInstance(CentralPortalOptions::class.java) + + init { + settings.gradle.lifecycle.beforeProject { project -> + if (project.rootProject == project) { + project.pluginManager.apply("com.gradleup.nmcp.aggregation") + + project.extensions.getByType(NmcpAggregationExtension::class.java).centralPortal { + it.username.set(spec.username) + it.password.set(spec.password) + it.publishingType.set(spec.publishingType) + it.publicationName.set(spec.publicationName) + it.validationTimeout.set(spec.validationTimeout) + it.publishingTimeout.set(spec.publishingTimeout) + it.baseUrl.set(spec.baseUrl) + it.uploadSnapshotsParallelism.set(spec.uploadSnapshotsParallelism) + } + + project.allprojects { + project.dependencies.add(nmcpConsumerConfigurationName, project.dependencies.create(it)) + } + } + project.pluginManager.withPlugin("maven-publish") { + project.pluginManager.apply("com.gradleup.nmcp") + } + } + } + + override fun centralPortal(action: Action) { + action.execute(spec) + } +} diff --git a/nmcp/src/main/kotlin/nmcp/internal/utils.kt b/nmcp/src/main/kotlin/nmcp/internal/utils.kt index e38bab4..9ebfb8c 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/utils.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/utils.kt @@ -1,6 +1,6 @@ package nmcp.internal -import gratatouille.wiring.capitalizeFirstLetter +import gratatouille.capitalizeFirstLetter import java.io.File import nmcp.CentralPortalOptions import nmcp.internal.task.registerNmcpFindDeploymentNameTask diff --git a/nmcp/src/main/kotlin/nmcp/plugins.kt b/nmcp/src/main/kotlin/nmcp/plugins.kt index a0ba7d7..37e88f5 100644 --- a/nmcp/src/main/kotlin/nmcp/plugins.kt +++ b/nmcp/src/main/kotlin/nmcp/plugins.kt @@ -1,43 +1,5 @@ package nmcp -import gratatouille.wiring.GPlugin -import nmcp.internal.DefaultNmcpAggregationExtension -import nmcp.internal.DefaultNmcpExtension -import nmcp.internal.nmcpConsumerConfigurationName -import org.gradle.api.Project -import org.gradle.api.initialization.Settings +internal const val nmcpExtensionName = "nmcp" +internal const val nmcpAggregationExtensionName = "nmcpAggregation" -internal val nmcpExtensionName = "nmcp" -internal val nmcpAggregationExtensionName = "nmcpAggregation" - -@GPlugin(id = "com.gradleup.nmcp") -internal fun nmcp(project: Project) { - project.extensions.create(NmcpExtension::class.java, nmcpExtensionName, DefaultNmcpExtension::class.java, project) -} - -@GPlugin(id = "com.gradleup.nmcp.aggregation") -internal fun nmcpAggregation(project: Project) { - project.extensions.create( - NmcpAggregationExtension::class.java, - nmcpAggregationExtensionName, - DefaultNmcpAggregationExtension::class.java, - project, - ) -} - -@Suppress("UnstableApiUsage") -@GPlugin(id = "com.gradleup.nmcp.settings") -internal fun nmcpSettings(settings: Settings) { - settings.gradle.lifecycle.beforeProject { project -> - if (project.rootProject == project) { - project.pluginManager.apply("com.gradleup.nmcp.aggregation") - - project.allprojects { - project.dependencies.add(nmcpConsumerConfigurationName, project.dependencies.create(it)) - } - } - project.pluginManager.withPlugin("maven-publish") { - project.pluginManager.apply("com.gradleup.nmcp") - } - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 657f14e..d17d562 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,3 +21,4 @@ pluginManagement { rootProject.name = "nmcp-root" include(":nmcp", ":nmcp-tasks") + diff --git a/tests/kmp/build.gradle.kts b/tests/kmp/build.gradle.kts index 4c3d2d7..d8d0b49 100644 --- a/tests/kmp/build.gradle.kts +++ b/tests/kmp/build.gradle.kts @@ -35,10 +35,12 @@ nmcpAggregation { password = System.getenv("MAVEN_CENTRAL_PASSWORD") } publishingType = "USER_MANAGED" + check(publicationName.get() == "test") { + "Error, expected 'test', got '${publicationName.get()}'." + } } } - tasks.register("checkZip") { dependsOn("publishAggregationToCentralPortal") doLast { diff --git a/tests/kmp/settings.gradle.kts b/tests/kmp/settings.gradle.kts index 23a4b38..5ea3cfd 100644 --- a/tests/kmp/settings.gradle.kts +++ b/tests/kmp/settings.gradle.kts @@ -11,6 +11,12 @@ plugins { id("com.gradleup.nmcp.settings") } +nmcpSettings { + centralPortal { + publicationName.set("test") + } +} + includeBuild("../../") include(":module1") include(":module2")