Apollo compiler plugins
The Apollo compiler supports a wide range of options. For the cases where these options are not enough, you can use Apollo compiler plugins to modify the behaviour of the compiler.
Apollo compiler plugins allow to:
- Change the layout of the generated sources (name of the classes, package names, capitalization rules).
- Change the ids of operation for persisted queries.
- Transform the JavaPoet/KotlinPoet models.
- Transform the Apollo IR.
Implementing a compiler plugin
In this example we will implement a plugin that uses custom persisted queries ids registered on your backend.
The Apollo compiler use the ServiceLoader API to load plugins at runtime. Plugins need to be implemented in a separate module that is added to the classpath.
To start, create a new Gradle module and add apollo-compiler
as a dependency to the module build.gradle[.kts]
file. In this example, we'll use apollo-compiler-plugin
for the module name:
// apollo-compiler-plugin/build.gradle.ktsplugins {id("org.jetbrains.kotlin.jvm")}dependencies {// Add apollo-compiler as a dependencyimplementation("com.apollographql.apollo3:apollo-compiler:4.0.0-beta.4")}
Next create your plugin in a src/main/kotlin/mypackage/MyPlugin
file:
package mypackageimport com.apollographql.apollo3.compiler.OperationOutputGeneratorimport com.apollographql.apollo3.compiler.Pluginimport com.apollographql.apollo3.compiler.operationoutput.OperationDescriptorimport com.apollographql.apollo3.compiler.operationoutput.OperationIdclass MyPlugin: Plugin {override fun operationIds(descriptors: List<OperationDescriptor>): List<OperationId> {// This assumes the returned ids are in the same order as the descriptorsreturn registerOperations(descriptors).withIndex().map { OperationId(it.value, descriptors[it.index].name) }}/*** Send operations to a remote server and return the server persisted ids*/fun registerOperations(descriptors: List<OperationDescriptor>): List<String> {// ...}}
Make your plugin discoverable by ServiceLoader using a resource in src/main/resources/META-INF/services/com.apollographql.apollo3.compiler.Plugin
. This file contains the fully qualified name of your plugin:
mypackage.MyPlugin
[!NOTE]
The name of the resource file is important. It must be com.apollographql.apollo3.compiler.Plugin
and be in the META-INF/services
folder. This is how ServiceLoader
looks up Plugins
at runtime.
Adding a plugin to the Apollo compiler classpath
Use the Service.plugin()
Gradle method to add the plugin to the Apollo compiler classpath:
// app/build.gradle.ktsplugins {id("org.jetbrains.kotlin.jvm")id("com.apollographql.apollo3")}apollo {service("service") {packageName.set("com.example")// Add your plugin to the Apollo compiler classpathplugin(project(":apollo-compiler-plugin"))}}
The plugin code will now be invoked the next time the compiler is invoked.
Other references
For other plugin APIs like layout, IR, JavaPoet and KotlinPoet transforms, check out the Plugin API docs
For more examples, check out the integration-tests.