Skip to content

Commit 3f622e4

Browse files
committed
Simplify to only 2 plugins
1 parent b66fdbb commit 3f622e4

File tree

14 files changed

+198
-426
lines changed

14 files changed

+198
-426
lines changed

β€ŽREADME.mdβ€Ž

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ When used in classloader isolation mode, Gratatouille enforces a clear separatio
66

77
**Key Features**:
88

9-
* [Tasks Generation](#functions)
9+
* [Tasks Generation](#functional-programming-style)
1010
* [Comprehensive input/output types](#supported-input-and-output-types)
1111
* [Non overlapping task outputs by default](#non-overlapping-task-outputs-by-default)
1212
* [Build cache by default](#build-cache-by-default)
@@ -17,7 +17,7 @@ When used in classloader isolation mode, Gratatouille enforces a clear separatio
1717
* [Classloader isolation](#classloader-isolation-optional) (optional)
1818
* [kotlinx serialization support](#experimental-kotlinxserialization-support) (experimental)
1919

20-
Check out the [Apollo Faker Gradle Plugin](https://github.com/apollographql/apollo-kotlin-faker/blob/main/gradle-plugin/build.gradle.kts) for a real life example or [test-app](test-app) for integration tests.
20+
Check out the [Apollo Faker Gradle Plugin](https://github.com/apollographql/apollo-kotlin-faker/blob/main/gradle-plugin/build.gradle.kts) for a real-life example or [test-app](test-app) for integration tests.
2121

2222
Gratatouille also uses Gratatouille to build its plugin, check [gratatouille-gradle-plugin/build.gradle.kts](gratatouille-gradle-plugin/build.gradle.kts) for more details.
2323

@@ -37,9 +37,9 @@ plugins {
3737

3838
gratatouille {
3939
// Configure the plugin marker
40+
// This is only required for publication.
41+
// If you're using GradleUp/Librarian, you can skip this step.
4042
pluginMarker("com.example.myplugin")
41-
// Enable code generation
42-
codeGeneration()
4343
}
4444
```
4545

@@ -192,7 +192,7 @@ fun myPlugin(project: Project) {
192192
}
193193
```
194194

195-
No need to implement `DefaultTask`, no risk of forgetting `@Cacheable`, etc... Gratatouille provides good defaults making it easier to write plugins.
195+
No need to implement `DefaultTask`, no risk of forgetting `@Cacheable`, etc... Gratatouille provides good defaults, making it easier to write plugins.
196196

197197
## Features
198198

@@ -352,15 +352,12 @@ dependencies {
352352
// Add dependencies needed to do your task work
353353
implementation("com.squareup:kotlinpoet:1.14.2")
354354
implementation("org.ow2.asm:asm-commons:9.6")
355-
// do **not** add gradleApi() here
355+
// do **not** add gradle-api here
356356
}
357357

358358
gratatouille {
359-
// Enable code generation
360-
codeGeneration {
361-
// Enables classloader isolation
362-
classLoaderIsolation()
363-
}
359+
// You may specify additional configuration options here
360+
enableKotlinxSerialization.set(true)
364361
}
365362
```
366363

@@ -379,7 +376,7 @@ internal fun prepareIngredients(persons: Int, ingredients: GOutputFile) {
379376
}
380377
```
381378

382-
When using this mode, the plugin wiring code is generated as resources that are included by the `gradle-plugin` project.
379+
When using this mode, the plugin wiring code is generated as resources that are automatically included by the `gradle-plugin` project.
383380

384381
### Step 2/2 gradle-plugin
385382

@@ -388,12 +385,12 @@ To use the generated code in your plugin, create an `gradle-plugin` project next
388385
> [!IMPORTANT]
389386
> By using two different projects, Gratatouille ensures that Gradle classes do not leak in your plugin implementation and vice-versa.
390387
391-
Apply the `com.gradleup.gratatouille.wiring` plugin in your `gradle-plugin` project:
388+
Apply the `com.gradleup.gratatouille` plugin in your `gradle-plugin` project:
392389

393390
```kotlin
394391
// gradle-plugin/build.gradle.kts
395392
plugins {
396-
id("com.gradleup.gratatouille.wiring").version("0.1.3")
393+
id("com.gradleup.gratatouille").version("0.1.3")
397394
}
398395

399396
gratatouille {

β€Žgratatouille-gradle-plugin/api/gratatouille-gradle-plugin.apiβ€Ž

Lines changed: 18 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,52 @@
11
public abstract interface class gratatouille/gradle/ClassloaderIsolationSpec {
2-
public abstract fun getConfigurationName ()Lorg/gradle/api/provider/Property;
3-
public abstract fun getCoordinates ()Lorg/gradle/api/provider/Property;
42
}
53

6-
public abstract interface class gratatouille/gradle/CodeGenerationSpec {
7-
public abstract fun classLoaderIsolation ()V
8-
public abstract fun classLoaderIsolation (Lorg/gradle/api/Action;)V
9-
public abstract fun getAddDependencies ()Lorg/gradle/api/provider/Property;
4+
public abstract interface class gratatouille/gradle/CodeGenerationExtension {
5+
public abstract fun getAddDependencies ()Z
106
public abstract fun getEnableKotlinxSerialization ()Lorg/gradle/api/provider/Property;
7+
public abstract fun setAddDependencies (Z)V
118
}
129

13-
public abstract interface class gratatouille/gradle/CodeGeneratorExtension {
14-
public abstract fun codeGeneration ()V
15-
public abstract fun codeGeneration (Lorg/gradle/api/Action;)V
10+
public abstract interface class gratatouille/gradle/GratatouilleExtension : gratatouille/gradle/CodeGenerationExtension {
11+
public abstract fun pluginDescriptor (Ljava/lang/String;Ljava/lang/String;)V
12+
public abstract fun pluginLocalPublication (Ljava/lang/String;)V
13+
public abstract fun pluginMarker (Ljava/lang/String;)V
14+
public abstract fun pluginMarker (Ljava/lang/String;Ljava/lang/String;)V
1615
}
1716

18-
public abstract class gratatouille/gradle/DefaultGratatouilleExtension : gratatouille/gradle/GratatouilleExtension {
19-
public fun <init> (Lorg/gradle/api/Project;)V
20-
public fun codeGeneration ()V
21-
public fun codeGeneration (Lorg/gradle/api/Action;)V
22-
public fun pluginDescriptor (Ljava/lang/String;Ljava/lang/String;)V
23-
public fun pluginLocalPublication (Ljava/lang/String;)V
24-
public fun pluginMarker (Ljava/lang/String;)V
25-
public fun pluginMarker (Ljava/lang/String;Ljava/lang/String;)V
17+
public abstract interface class gratatouille/gradle/GratatouilleTasksExtension : gratatouille/gradle/CodeGenerationExtension {
18+
public abstract fun getConfigurationName ()Lorg/gradle/api/provider/Property;
19+
public abstract fun getCoordinates ()Lorg/gradle/api/provider/Property;
2620
}
2721

28-
public abstract class gratatouille/gradle/DefaultGratatouilleTasksExtension : gratatouille/gradle/GratatouilleTasksExtension {
29-
public fun <init> (Lorg/gradle/api/Project;)V
30-
public fun codeGeneration ()V
31-
public fun codeGeneration (Lorg/gradle/api/Action;)V
22+
public final class gratatouille/gradle/VersionKt {
23+
public static final field VERSION Ljava/lang/String;
3224
}
3325

34-
public abstract class gratatouille/gradle/DefaultGratatouilleWiringExtension : gratatouille/gradle/GratatouilleWiringExtension {
26+
public abstract class gratatouille/gradle/internal/DefaultGratatouilleExtension : gratatouille/gradle/GratatouilleExtension {
3527
public fun <init> (Lorg/gradle/api/Project;)V
36-
public fun codeGeneration ()V
37-
public fun codeGeneration (Lorg/gradle/api/Action;)V
3828
public fun pluginDescriptor (Ljava/lang/String;Ljava/lang/String;)V
3929
public fun pluginLocalPublication (Ljava/lang/String;)V
4030
public fun pluginMarker (Ljava/lang/String;)V
4131
public fun pluginMarker (Ljava/lang/String;Ljava/lang/String;)V
4232
}
4333

44-
public final class gratatouille/gradle/ExtensionsKt {
45-
public static final fun plugin (Lorg/gradle/api/Project;)V
46-
public static final fun tasksPlugin (Lorg/gradle/api/Project;)V
47-
public static final fun wiringPlugin (Lorg/gradle/api/Project;)V
48-
}
49-
50-
public abstract interface class gratatouille/gradle/GratatouilleExtension : gratatouille/gradle/CodeGeneratorExtension, gratatouille/gradle/WiringExtension {
51-
}
52-
53-
public abstract interface class gratatouille/gradle/GratatouilleTasksExtension : gratatouille/gradle/CodeGeneratorExtension {
54-
}
55-
56-
public abstract interface class gratatouille/gradle/GratatouilleWiringExtension : gratatouille/gradle/CodeGeneratorExtension, gratatouille/gradle/WiringExtension {
57-
}
58-
59-
public abstract class gratatouille/gradle/Plugin : org/gradle/api/Plugin {
60-
public fun <init> ()V
61-
public synthetic fun apply (Ljava/lang/Object;)V
62-
public fun apply (Lorg/gradle/api/Project;)V
63-
}
64-
65-
public abstract class gratatouille/gradle/TasksPlugin : org/gradle/api/Plugin {
34+
public abstract class gratatouille/gradle/internal/DefaultGratatouilleExtensionPlugin : org/gradle/api/Plugin {
6635
public fun <init> ()V
6736
public synthetic fun apply (Ljava/lang/Object;)V
6837
public fun apply (Lorg/gradle/api/Project;)V
6938
}
7039

71-
public final class gratatouille/gradle/VersionKt {
72-
public static final field VERSION Ljava/lang/String;
73-
}
74-
75-
public abstract interface class gratatouille/gradle/WiringExtension {
76-
public abstract fun pluginDescriptor (Ljava/lang/String;Ljava/lang/String;)V
77-
public abstract fun pluginLocalPublication (Ljava/lang/String;)V
78-
public abstract fun pluginMarker (Ljava/lang/String;)V
79-
public abstract fun pluginMarker (Ljava/lang/String;Ljava/lang/String;)V
40+
public abstract class gratatouille/gradle/internal/DefaultGratatouilleTasksExtension : gratatouille/gradle/GratatouilleTasksExtension {
41+
public fun <init> (Lorg/gradle/api/Project;)V
8042
}
8143

82-
public abstract class gratatouille/gradle/WiringPlugin : org/gradle/api/Plugin {
44+
public abstract class gratatouille/gradle/internal/DefaultGratatouilleTasksExtensionPlugin : org/gradle/api/Plugin {
8345
public fun <init> ()V
8446
public synthetic fun apply (Ljava/lang/Object;)V
8547
public fun apply (Lorg/gradle/api/Project;)V
8648
}
8749

88-
public final class gratatouille/gradle/internal/DefaultCodeGenerationSpec : gratatouille/gradle/CodeGenerationSpec {
89-
public fun <init> (Lorg/gradle/api/Project;)V
90-
public fun classLoaderIsolation ()V
91-
public fun classLoaderIsolation (Lorg/gradle/api/Action;)V
92-
public fun getAddDependencies ()Lorg/gradle/api/provider/Property;
93-
public fun getEnableKotlinxSerialization ()Lorg/gradle/api/provider/Property;
94-
}
95-
9650
public final class gratatouille/gradle/tasks/GenerateDescriptorEntryPoint {
9751
public static final field Companion Lgratatouille/gradle/tasks/GenerateDescriptorEntryPoint$Companion;
9852
public fun <init> ()V

β€Žgratatouille-gradle-plugin/src/main/kotlin/gratatouille/gradle/ClassloaderIsolationSpec.ktβ€Ž

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,6 @@ package gratatouille.gradle
33
import org.gradle.api.provider.Property
44

55
interface ClassloaderIsolationSpec {
6-
/**
7-
* The coordinates of the artifact where the task implementations are in the form group:artifact:version.
8-
*
9-
* Default: project.group:project.name:project.version
10-
*/
11-
val coordinates: Property<String>
126

13-
/**
14-
* Unique name to identify the configuration
15-
*
16-
* Defaults to a name based on [coordinates]
17-
*/
18-
val configurationName: Property<String>
197

208
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package gratatouille.gradle
2+
3+
import org.gradle.api.provider.Property
4+
5+
interface CodeGenerationExtension {
6+
/**
7+
* Enables experimental support for kotlinx serialization when generating tasks.
8+
*/
9+
val enableKotlinxSerialization: Property<Boolean>
10+
11+
/**
12+
* Automatically add dependencies needed for code generation if KSP is present.
13+
*
14+
* Default: true
15+
*/
16+
var addDependencies: Boolean
17+
}

β€Žgratatouille-gradle-plugin/src/main/kotlin/gratatouille/gradle/CodeGenerationSpec.ktβ€Ž

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package gratatouille.gradle
2+
3+
import gratatouille.wiring.GPlugin
4+
import gratatouille.gradle.internal.*
5+
import gratatouille.gradle.tasks.registerUnzipFilesTask
6+
import org.gradle.api.Action
7+
import org.gradle.api.Project
8+
import org.gradle.api.attributes.Usage
9+
10+
interface GratatouilleExtension: CodeGenerationExtension {
11+
/**
12+
* Registers a `generate${pluginId}Descriptor` task that generates a [plugin descriptor](https://docs.gradle.org/current/userguide/java_gradle_plugin.html#sec:gradle_plugin_dev_usage) for the plugin
13+
* and wires it to the `processResources` task.
14+
*
15+
* The descriptor will be included in the .jar file making it possible to locate the plugin implementation from the plugin id.
16+
*
17+
* Calling this function is usually not needed if using code generation as code generation can use `@GPlugin` to get the plugin id.
18+
*
19+
* @param implementationClass the fully qualified class name for the plugin implementation. Example: `com.example.ExamplePlugin`.
20+
*/
21+
fun pluginDescriptor(id: String, implementationClass: String)
22+
23+
/**
24+
* Creates a new `${pluginId}PluginMarkerMaven` publication allowing to locate the implementation coordinates from the plugin id.
25+
* This method requires that only a single publication is present in this project. See other overloads if you need more control over publications.
26+
*
27+
* @throws IllegalStateException if there are more
28+
*/
29+
fun pluginMarker(id: String)
30+
31+
/**
32+
* Creates a new `${pluginId}PluginMarkerMaven` publication allowing to locate the implementation coordinates from the plugin id.
33+
*
34+
* @param mainPublication the publication to redirect to.
35+
*/
36+
fun pluginMarker(id: String, mainPublication: String)
37+
38+
/**
39+
* Registers a local plugin publication so that the plugin is discoverable from included builds.
40+
*
41+
* This function uses Gradle internal APIs.
42+
*
43+
* @param id the plugin id
44+
*/
45+
fun pluginLocalPublication(id: String)
46+
}
47+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package gratatouille.gradle
2+
3+
import org.gradle.api.provider.Property
4+
5+
interface GratatouilleTasksExtension: CodeGenerationExtension {
6+
/**
7+
* The coordinates of the artifact where the task implementations are in the form group:artifact:version.
8+
*
9+
* Default: project.group:project.name:project.version
10+
*/
11+
val coordinates: Property<String>
12+
13+
/**
14+
* Unique name to identify the configuration
15+
*
16+
* Defaults to a name based on [coordinates]
17+
*/
18+
val configurationName: Property<String>
19+
}

0 commit comments

Comments
Β (0)