Gradle插件食谱
使用多个GraphQL API
Apollo Kotlin支持与不同模式的多GraphQL端点通信。为此,创建多个服务,如下所示:
apollo {service("starwars") {srcDir("src/main/graphql/starwars")packageName.set("com.starwars")}service("githunt") {srcDir("src/main/graphql/githunt")packageName.set("com.githunt")}}
指定模式位置
使用schemaFiles
属性指定
apollo {service("service") {schemaFiles.from(file("shared/graphql/schema.graphqls"))}}
ⓘ 注意
如果schemaFiles
未设置,Apollo Kotlin会将src/main/graphql/
(Android/JVM项目)或src/commonMain/graphql/
(多平台项目)中的所有*.[graphqls|json|sdl]
文件组合在一起。
合并多个模式文件
Apollo Kotlin支持一组客户端指令,包括@nonnull
、@optional
和@typePolicy
。这些指令允许您通过客户端特定的类型和字段扩展服务器的基本模式。
如果您在一个单独的文件(通常命名为extra.graphqls
)中扩展了模式,您可以告诉Apollo Kotlin从多个文件组合中构建其模式,如下所示:
apollo {service("service") {schemaFiles.from("shared/graphql/schema.graphqls", "shared/graphql/extra.graphqls")}}
连接生成的源
默认情况下,Apollo Kotlin会将生成的源
- 添加到JVM项目的
main
源集 - 到多平台项目的
commonMain
源集 - 到所有非测试变体,适用于Android项目
您可以通过outputDirConnection
属性自定义此行为。例如,要将服务连接到Kotlin JVM项目的测试源集:
apollo {service("service") {outputDirConnection {connectToKotlinSourceSet("test")}}}
Android变体支持
有时,根据Android项目变体拥有不同的操作或模式
要实现这一点,您可以指示Gradle插件自动为每个变体配置一个服务:
apollo {createAllAndroidVariantServices(sourceFolder = ".", nameSuffix = "") {// Configure the service herepackageName.set("...")}}
sourceFolder
是在“src/$sourceSetName/graphql”相对于GraphQL的位置。传递“.”以查找“src/$sourceSetName/graphql”中。nameSuffix
是用于服务名的后缀。留空则使用变体名不变。
类似于Android变体系统对源代码的处理,GraphQL文件是以附加方式处理的,并且src/main/graphql中的文件包含在所有服务中。
例如,如果某些操作只能存在于调试构建中,则项目结构可能如下所示:
- main- graphql- schema.graphqls // Schema for all variants- operations.graphql // Operations shared by all variants- debug- graphql- operations.graphql // Operations specific to the 'debug' build type
或者如果每个flavor都有一个特定的后端,则可能如下所示
- main- demo- graphql- schema.graphqls // Schema for the 'demo' flavor- operations.graphql // Operations specific to the 'demo' flavor- full- graphql- schema.graphqls // Schema for the 'full' flavor- operations.graphql // Operations specific to the 'full' flavor
apollo {service("debug") {srcDir(file("src/debug/graphql/"))packageName.set("com.example")outputDirConnection {connectToAndroidSourceSet("debug")}}service("release") {srcDir(file("src/release/graphql/"))packageName.set("com.example")outputDirConnection {connectToAndroidSourceSet("release")}}}
下载模式
apollo {service("starwars") {packageName.set("com.starwars")// This creates a downloadStarwarsApolloSchemaFromIntrospection taskintrospection {endpointUrl.set("https://your.domain/graphql/endpoint")// The path is interpreted relative to the current projectschemaFile.set(file("src/main/graphql/com/example/schema.graphqls"))}}}
apollo {service("starwars") {packageName.set("com.starwars")// This creates a downloadStarwarsApolloSchemaFromRegistry taskregistry {key.set(System.getenv("APOLLO_KEY"))graph.set(System.geten("APOLLO_GRAPH"))// The path is interpreted relative to the current project here, no need to prepend 'app'schemaFile.set(file("src/main/graphql/com/example/schema.graphqls"))}}}
生成方法
- “equalsHashCode”生成用于比较生成类属性的
以下是一些可能的配置
apollo {service("service") {// Generates equals and hashCodegenerateMethods.set(listOf("equalsHashCode"))// Generates toString, equals, and hashcode (the default for Java)generateMethods.set(listOf("equalsHashCode", "toString"))// Only generates copygenerateMethods.set(listOf("copy"))// Generates data classes (the default for Kotlin)generateMethods.set(listOf("dataClass"))}}