多模块代码生成
对于多模块项目,Apollo Kotlin 允许您在功能模块中定义查询并重用 片段 和类型,来自另一个模块依赖。这有助于更好地分离关注点并减少构建时间。
注意:此页面用于在不同模块之间共享方案并定义您的.graphql
操作在不同的模块中。如果所有您的 .graphql
文件都位于单个模块中,您可以使用 ApolloClient
如其他Kotlin依赖项而不需要这样做。
设置
多模块需要只有一个模块包含一个方案。这是其他模块可以重用的方案。在本 文档 中,我们将此模块称为“方案模块”。
配置您的方案模块以生成Apollo元数据
// schema/build.gradle.ktsapollo {service("service") {generateApolloMetadata.set(true)}}
并将你的模式模块声明为功能模块的依赖项
// feature/build.gradle.ktsdependencies {implementation("com.apollographql.apollo3:apollo-runtime:3.8.5")// more regular dependencies// Apollo dependenciesapolloMetadata(project(":schema"))// You also need to declare the schema module as a regular dependencyimplementation(project(":schema"))}
解决 Apollo 依赖关系
功能模块可以有任意数量的 Apollo 模块依赖项,每个都贡献它们自己的类型和片段。
传递的 Apollo 依赖项始终会将它们的片段和类型暴露给下游模块。换句话说,没有像常规依赖项那样的实现 vs API概念。Apollo 依赖项始终会向下游暴露一切(即,它们被视为API)。
请注意的另一件重要的事情是,所有模块都必须共享同一个模式。将schema.graphqls | json]放在模式模块中,即依赖项链中最高的模块中的graph:
// feature/build.gradle.kts// This module must not have a schema// This module can use fragments and types from 'shared' and 'schema'dependencies {apolloMetadata(project(":shared"))}// shared/build.gradle.kts// This module must not have a schema// This module can use fragments and types from 'schema'dependencies {apolloMetadata(project(":schema"))}apollo {service("service") {generateApolloMetadata.set(true)}}// schema/build.gradle.kts// This module is the schema module// Place the schema in this moduleapollo {service("service") {generateApolloMetadata.set(true)}}
多平台
对于多平台项目,在顶层dependencies {}
块中放置apolloMetadata
:
// feature/build.gradle.kts// This module must not have a schema// This module can use fragments and types from 'shared' and 'schema'dependencies {apolloMetadata(project(":shared"))}kotlin {jvm()sourceSets {val commonMain by getting {dependencies {implementation(project(":shared")implementation("com.apollographql.apollo:apollo-api:3.1.0")api("com.apollographql.apollo:apollo-runtime-kotlin:3.1.0")}}}}
不同约束的总结
- 所有模块都必须应用 Apollo Gradle 插件的相同版本
- 使用相同模式的所有模块必须使用相同的服务名
- 模式模块并且只有模式模块必须定义模式。[[json | graphqls]]
- 模式模块并且只有模式模块可以调用
mapScalar
- 模式模块并且只有模式模块可以定义generateKotlinModels
类型冲突
当使用多个模块时,Apollo Kotlin 将为在此模块中定义的每个operation和fragment生成模型。此外,它还将为这些操作使用的模式类型生成类。例如,对于输入对象、枚举、自定义Scalars等...
如果两个兄弟模块使用相同的模式类型并且此模式类型没有在上游生成,则每个模块将生成自己的模式类型版本,这可能导致冲突。为防止这种情况,Apollo Kotlin 将注册一个全局的 "check${service}ApolloDuplicates" 任务,如果存在重复则失败。
如果发生这种情况,您需要手动解决类型冲突,通过强制在上游模块中生成冲突类型。这可以通过使用alwaysGenerateTypesMatching
Gradle 选项来完成:
// shared/build.gradle.ktsapollo {service("service") {// For an example if ReviewInput clashesalwaysGenerateTypesMatching.set(listOf("ReviewInput"))// You can also pass Regex patternsalwaysGenerateTypesMatching.set(listOf(".*Input"))}}
// shared/build.gradleapollo {service("service") {// For an example if ReviewInput clashesalwaysGenerateTypesMatching.set(["ReviewInput"])// You can also pass Regex patternsalwaysGenerateTypesMatching.set([".*Input"])}}