Gradle 插件配置
Apollo Kotlin的默认配置适用于大多数用例。如果您是初学者,请参阅入门指南以了解默认Gradle配置的概述。
本文介绍了使用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")}}
指定模式位置
使用schemaFile
属性指定您的模式文件的位置:
apollo {service("service") {schemaFile.set(file("shared/graphql/schema.graphqls"))}}
默认情况下,Apollo Kotlin会将项目中所有匹配模式schema.[graphqls|json|sdl]
的文件合并。
合并多个模式文件
Apollo Kotlin支持一系列客户端指令,包括@nonnull
、@optional
和@typePolicy
。这些指令使得您能够通过客户端特定的类型和字段扩展您的服务器基础模式。
如果您在一个单独的文件中扩展您的模式,您可以指示Apollo Kotlin从多个文件组合中构建其模式,如下所示:
apollo {service("service") {schemaFiles.setFrom("shared/graphql/schema.graphqls", "shared/graphql/extra.graphqls")}}
默认情况下,Apollo Kotlin会将项目中所有匹配模式schema.[graphqls|json|sdl]
的文件合并。
连接生成的源
默认情况下,Apollo Kotlin会将生成的源代码添加到
- Java VM项目的
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
或者例如,像这样(特定后端根据口味)。
- 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 服务,手动声明服务可能更简单,例如:
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")}}}
下载数据模式
默认情况下,Gradle 插件会注册一个downloadApolloSchema
任务,您可以从命令行使用该任务:
# --schema is interpreted relative to the project's root directory (can also be an absolute path). This example# assumes the root project directory and an Android app in `app`./gradlew downloadApolloSchema \--endpoint="https://your.domain/graphql/endpoint" \--schema="app/src/main/graphql/com/example/schema.graphqls"
如果您经常这样做或想从 CI 自动化过程,您可以配置一个introspection {}
块:
apollo {service("starwars") {packageName.set("com.starwars")// This will create a downloadStarwarsApolloSchemaFromIntrospection taskintrospection {endpointUrl.set("https://your.domain/graphql/endpoint")// 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"))}}}
这将创建一个名为download<ServiceName>ApolloSchemaFromIntrospection
的任务。
[!NOTE]
这与其他的downloadApolloSchema
任务不同。请确保调用download<ServiceName>ApolloSchemaFromIntrospection
如果您使用Apollo Studio注册模式,请使用registry
块替代:
apollo {service("starwars") {packageName.set("com.starwars")// This will create a downloadStarwarsApolloSchemaFromRegistry taskregistry {key.set(System.getenv("APOLLO_KEY"))graph.set(System.getenv("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"))}}}
这将创建一个名为download<ServiceName>ApolloSchemaFromRegistry
的任务(默认为downloadServiceApolloSchemaFromRegistry
)。