Skip to content

Commit 8839a38

Browse files
authored
Allow to configure the whole build from the settings script (#223)
1 parent 28deef5 commit 8839a38

15 files changed

Lines changed: 124 additions & 70 deletions

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import com.gradleup.librarian.gradle.Librarian
33
plugins {
44
alias(libs.plugins.kgp).apply(false)
55
alias(libs.plugins.ksp).apply(false)
6-
alias(libs.plugins.gratatouille.wiring).apply(false)
6+
alias(libs.plugins.gratatouille).apply(false)
77
alias(libs.plugins.librarian).apply(false)
88
alias(libs.plugins.nmcp).apply(false)
99
alias(libs.plugins.compat).apply(false)

gradle/libs.versions.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
[versions]
22
kgp = "2.2.20"
33
ksp = "2.3.2"
4-
gratatouille-runtime = "0.1.3"
5-
gratatouille-plugin = "0.1.3"
4+
gratatouille-runtime = "0.2.0"
5+
gratatouille-plugin = "0.2.0"
66

77
[libraries]
88
json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1"
@@ -14,14 +14,14 @@ kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test" }
1414
xmlutil = "io.github.pdvrieze.xmlutil:serialization:0.91.1"
1515
kgp = { module = "org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin", version.ref = "kgp" }
1616
coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2"
17-
gratatouille-wiring-runtime = { module = "com.gradleup.gratatouille:gratatouille-wiring-runtime", version.ref = "gratatouille-runtime" }
17+
gratatouille-runtime = { module = "com.gradleup.gratatouille:gratatouille-runtime", version.ref = "gratatouille-runtime" }
1818
gratatouille-tasks-runtime = { module = "com.gradleup.gratatouille:gratatouille-tasks-runtime", version.ref = "gratatouille-runtime" }
1919

2020
[plugins]
2121
kgp = { id = "org.jetbrains.kotlin.jvm", version.ref = "kgp" }
2222
serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kgp" }
2323
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
24-
gratatouille-wiring = { id = "com.gradleup.gratatouille.wiring", version.ref = "gratatouille-plugin" }
24+
gratatouille = { id = "com.gradleup.gratatouille", version.ref = "gratatouille-plugin" }
2525
librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-6898196f1f9759091ae6fa9bbe84154ec28a9331" }
2626
nmcp = { id = "com.gradleup.nmcp", version = "1.3.0" }
2727
compat = { id = "com.gradleup.compat.patrouille", version = "0.0.1-SNAPSHOT-9da44b3b93e36a196ae5afc9f7a79a46a82763cd" }

nmcp-tasks/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ plugins {
1010
Librarian.module(project)
1111

1212
gratatouille {
13-
codeGeneration {
14-
addDependencies.set(false)
15-
classLoaderIsolation {
16-
configurationName.set("nmcpTasks")
17-
}
18-
}
13+
configurationName.set("nmcpTasks")
1914
}
2015

2116
dependencies {

nmcp/api/nmcp.api

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,34 @@ public abstract interface class nmcp/NmcpAggregationExtension {
1616
public abstract fun publishAllProjectsProbablyBreakingProjectIsolation ()V
1717
}
1818

19-
public abstract class nmcp/NmcpAggregationPlugin : org/gradle/api/Plugin {
20-
public fun <init> ()V
21-
public synthetic fun apply (Ljava/lang/Object;)V
22-
public fun apply (Lorg/gradle/api/Project;)V
23-
}
24-
2519
public abstract interface class nmcp/NmcpExtension {
2620
public abstract fun extraFiles (Ljava/lang/Object;)V
2721
public abstract fun publishAllPublicationsToCentralPortal (Lorg/gradle/api/Action;)V
2822
}
2923

30-
public abstract class nmcp/NmcpPlugin : org/gradle/api/Plugin {
24+
public abstract interface class nmcp/NmcpSettings {
25+
public abstract fun centralPortal (Lorg/gradle/api/Action;)V
26+
}
27+
28+
public abstract class nmcp/internal/DefaultNmcpAggregationExtensionPlugin : org/gradle/api/Plugin {
3129
public fun <init> ()V
3230
public synthetic fun apply (Ljava/lang/Object;)V
3331
public fun apply (Lorg/gradle/api/Project;)V
3432
}
3533

36-
public abstract class nmcp/NmcpSettingsPlugin : org/gradle/api/Plugin {
34+
public abstract class nmcp/internal/DefaultNmcpExtensionPlugin : org/gradle/api/Plugin {
35+
public fun <init> ()V
36+
public synthetic fun apply (Ljava/lang/Object;)V
37+
public fun apply (Lorg/gradle/api/Project;)V
38+
}
39+
40+
public abstract class nmcp/internal/DefaultNmcpSettings : nmcp/NmcpSettings {
41+
public fun <init> (Lorg/gradle/api/initialization/Settings;)V
42+
public fun centralPortal (Lorg/gradle/api/Action;)V
43+
public abstract fun getObjects ()Lorg/gradle/api/model/ObjectFactory;
44+
}
45+
46+
public abstract class nmcp/internal/DefaultNmcpSettingsPlugin : org/gradle/api/Plugin {
3747
public fun <init> ()V
3848
public synthetic fun apply (Ljava/lang/Object;)V
3949
public fun apply (Lorg/gradle/api/initialization/Settings;)V

nmcp/build.gradle.kts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,19 @@ import com.gradleup.librarian.gradle.Librarian
33
plugins {
44
alias(libs.plugins.kgp)
55
alias(libs.plugins.ksp)
6-
id("com.gradleup.gratatouille.wiring")
6+
id("com.gradleup.gratatouille")
77
}
88

99
Librarian.module(project)
1010

1111
gratatouille {
12-
codeGeneration {
13-
addDependencies.set(false)
14-
}
12+
addDependencies = false
1513
pluginLocalPublication("com.gradleup.nmcp.settings")
1614
}
1715

1816
dependencies {
1917
gratatouille(project(":nmcp-tasks"))
2018
compileOnly(libs.gradle.min)
21-
implementation(libs.gratatouille.wiring.runtime)
19+
implementation(libs.gratatouille.runtime)
2220
testImplementation(libs.kotlin.test)
2321
}

nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@ interface NmcpAggregationExtension {
1818
*
1919
* This function is not compatible with breaking project isolation. To be compatible with project isolation,
2020
* add each subproject to the `nmcpAggregation` configuration dependencies.
21+
*
22+
* This was provided as a helper function but indirectly encouraged using non-project isolation compatible practices.
23+
*
24+
* Moving forward, use the `com.gradleup.nmcp.settings` or make a convention plugin that applies `com.gradleup.nmcp`
25+
* to all your projects.
2126
*/
27+
@Deprecated("Use the settings plugin or a convention plugin instead")
2228
fun publishAllProjectsProbablyBreakingProjectIsolation()
2329

2430
/**
25-
* [allFiles] contains all the files present in the "nmcpAggregation" configuration
31+
* [allFiles] contains all the files present in the "nmcpAggregation" configuration.
32+
*
33+
* This [FileCollection] is a multi-rooted [org.gradle.api.file.FileTree] containing only files.
2634
*
27-
* This [FileCollection] is a multi-rooted [org.gradle.api.file.FileTree] containing only files
35+
* [allFiles] may be used to publish manually to other repositories than Maven Central, such as Google Cloud
36+
* Storage and or AWS S3.
2837
*/
2938
val allFiles: FileCollection
3039
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package nmcp
2+
3+
import org.gradle.api.Action
4+
import org.gradle.api.file.FileCollection
5+
6+
interface NmcpSettings {
7+
/**
8+
* Configures publishing to central portal releases (Maven Central) and central portal snapshots.
9+
*
10+
* Adds the following tasks:
11+
* - nmcpPublishAggregationToCentralPortal
12+
* - nmcpPublishAggregationToCentralPortalSnapshots
13+
*/
14+
fun centralPortal(action: Action<CentralPortalOptions>)
15+
}

nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package nmcp.internal
22

3+
import gratatouille.GExtension
4+
import gratatouille.GPlugin
35
import nmcp.CentralPortalOptions
46
import nmcp.NmcpAggregationExtension
7+
import nmcp.nmcpAggregationExtensionName
58
import org.gradle.api.Action
69
import org.gradle.api.Project
710
import org.gradle.api.file.FileCollection
811

12+
@GExtension(pluginId = "com.gradleup.nmcp.aggregation", publicType = NmcpAggregationExtension::class, extensionName = nmcpAggregationExtensionName)
913
internal abstract class DefaultNmcpAggregationExtension(private val project: Project) : NmcpAggregationExtension {
1014
private val spec = project.objects.newInstance(CentralPortalOptions::class.java)
1115

@@ -30,6 +34,7 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro
3034
action.execute(spec)
3135
}
3236

37+
@Deprecated("Use the settings plugin or a convention plugin instead")
3338
override fun publishAllProjectsProbablyBreakingProjectIsolation() {
3439
check(project === project.rootProject) {
3540
"publishAllProjectsProbablyBreakingProjectIsolation() must be called from root project"

nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package nmcp.internal
22

3-
import gratatouille.wiring.capitalizeFirstLetter
3+
import gratatouille.GExtension
4+
import gratatouille.capitalizeFirstLetter
45
import nmcp.CentralPortalOptions
56
import nmcp.NmcpExtension
67
import nmcp.internal.task.registerCleanupDirectoryTask
8+
import nmcp.nmcpExtensionName
79
import org.gradle.api.Action
810
import org.gradle.api.Project
911
import org.gradle.api.publish.PublishingExtension
1012
import org.gradle.api.publish.maven.MavenPublication
1113

14+
@GExtension(pluginId = "com.gradleup.nmcp", publicType = NmcpExtension::class, extensionName = nmcpExtensionName)
1215
internal abstract class DefaultNmcpExtension(private val project: Project): NmcpExtension {
13-
private var centralPortalConfigured = false
1416
private val m2Dir = project.layout.buildDirectory.file("nmcp/m2")
1517
private val spec = project.objects.newInstance(CentralPortalOptions::class.java)
1618

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package nmcp.internal
2+
3+
import gratatouille.GExtension
4+
import javax.inject.Inject
5+
import nmcp.CentralPortalOptions
6+
import nmcp.NmcpAggregationExtension
7+
import nmcp.NmcpSettings
8+
import org.gradle.api.Action
9+
import org.gradle.api.initialization.Settings
10+
import org.gradle.api.model.ObjectFactory
11+
12+
@Suppress("UnstableApiUsage")
13+
@GExtension(pluginId = "com.gradleup.nmcp.settings", extensionName = "nmcpSettings", publicType = NmcpSettings::class)
14+
abstract class DefaultNmcpSettings(settings: Settings): NmcpSettings {
15+
@get:Inject
16+
abstract val objects: ObjectFactory
17+
18+
private val spec = objects.newInstance(CentralPortalOptions::class.java)
19+
20+
init {
21+
settings.gradle.lifecycle.beforeProject { project ->
22+
if (project.rootProject == project) {
23+
project.pluginManager.apply("com.gradleup.nmcp.aggregation")
24+
25+
project.extensions.getByType(NmcpAggregationExtension::class.java).centralPortal {
26+
it.username.set(spec.username)
27+
it.password.set(spec.password)
28+
it.publishingType.set(spec.publishingType)
29+
it.publicationName.set(spec.publicationName)
30+
it.validationTimeout.set(spec.validationTimeout)
31+
it.publishingTimeout.set(spec.publishingTimeout)
32+
it.baseUrl.set(spec.baseUrl)
33+
it.uploadSnapshotsParallelism.set(spec.uploadSnapshotsParallelism)
34+
}
35+
36+
project.allprojects {
37+
project.dependencies.add(nmcpConsumerConfigurationName, project.dependencies.create(it))
38+
}
39+
}
40+
project.pluginManager.withPlugin("maven-publish") {
41+
project.pluginManager.apply("com.gradleup.nmcp")
42+
}
43+
}
44+
}
45+
46+
override fun centralPortal(action: Action<CentralPortalOptions>) {
47+
action.execute(spec)
48+
}
49+
}

0 commit comments

Comments
 (0)