10月8日至10日加入我们,在纽约市学习关于 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入我们参加 2024 年纽约市 GraphQL 卓越峰会
文档
免费开始
您正在查看该软件以前版本的文档。 切换到最新的稳定版本。

多模块代码生成


对于多模块项目, 允许您在功能模块中定义查询并重用 和类型,来自另一个模块依赖。这有助于更好地分离关注点并减少构建时间。

注意:此页面用于在不同模块之间共享方案并定义您的.graphql 在不同的模块中。如果所有您的 .graphql 文件都位于单个模块中,您可以使用 ApolloClient 如其他Kotlin依赖项而不需要这样做。

设置

多模块需要只有一个模块包含一个方案。这是其他模块可以重用的方案。在本 中,我们将此模块称为“方案模块”。

配置您的方案模块以生成Apollo元数据

// schema/build.gradle.kts
apollo {
service("service") {
generateApolloMetadata.set(true)
}
}

并将你的模式模块声明为功能模块的依赖项

// feature/build.gradle.kts
dependencies {
implementation("com.apollographql.apollo3:apollo-runtime:3.8.5")
// more regular dependencies
// Apollo dependencies
apolloMetadata(project(":schema"))
// You also need to declare the schema module as a regular dependency
implementation(project(":schema"))
}

解决 Apollo 依赖关系

功能模块可以有任意数量的 Apollo 模块依赖项,每个都贡献它们自己的类型和片段

传递的 Apollo 依赖项始终会将它们的片段和类型暴露给下游模块。换句话说,没有像常规依赖项那样的实现 vs API概念。Apollo 依赖项始终会向下游暴露一切(即,它们被视为API)。

请注意的另一件重要的事情是,所有模块都必须共享同一个模式。将schema. | json]放在模式模块中,即依赖项链中最高的模块中的:

// 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 module
apollo {
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 将为在此模块中定义的每个生成模型。此外,它还将为这些操作使用的模式类型生成类。例如,对于输入对象、枚举、自定义等...

如果两个兄弟模块使用相同的模式类型并且此模式类型没有在上游生成,则每个模块将生成自己的模式类型版本,这可能导致冲突。为防止这种情况,Apollo Kotlin 将注册一个全局的 "check${service}ApolloDuplicates" 任务,如果存在重复则失败。

如果发生这种情况,您需要手动解决类型冲突,通过强制在上游模块中生成冲突类型。这可以通过使用alwaysGenerateTypesMatching Gradle 选项来完成:

// shared/build.gradle.kts
apollo {
service("service") {
// For an example if ReviewInput clashes
alwaysGenerateTypesMatching.set(listOf("ReviewInput"))
// You can also pass Regex patterns
alwaysGenerateTypesMatching.set(listOf(".*Input"))
}
}
// shared/build.gradle
apollo {
service("service") {
// For an example if ReviewInput clashes
alwaysGenerateTypesMatching.set(["ReviewInput"])
// You can also pass Regex patterns
alwaysGenerateTypesMatching.set([".*Input"])
}
}
上一页
客户意识
下一页
连接源集
评分文章评分在 GitHub 上编辑编辑论坛Discord

©2024Apollo Graph Inc.,又称 Apollo GraphQL。

隐私政策

公司