Schema 类型配置
为您的项目配置 schema 生成
在首次设置代码生成时,您需要指定一个schemaNamespace
,为生成的 schema 类型以及以下moduleType
来使用。这些值构成了您的代码生成配置中的 output.schemaTypes
属性。
该 moduleType
属性指示代码生成引擎如何将生成的 schema 类型链接到您的项目。代码生成引擎使用这些信息来确保生成正确的模型和 import
语句。
在本节中,我们将考虑您的项目的一些因素来解答以下问题
你应该使用哪个 schema moduleType
?
您GraphQL schema中的类型将被转换为生成的 Swift 类型,这些类型必须包含在您的项目中。可以通过为它们创建一个单独的 "schema 模块" 或直接嵌入到您的目标之一中来包含生成的 schema 类型。GraphQL schema 中的类型将被转换为生成的 Swift 类型,这些类型必须包含在您的项目中。生成的 schema 类型可以通过创建一个单独的 "schema 模块" 来包含在您的项目中,或者直接嵌入到您的一个目标中。
这两种方法的关键区别在于它们的命名空间。
- 当使用 schema 模块时,您的 schema 类型将成为使用提供的
schemaNamespace
作为模块名的模块中的public
顶级符号。 - 当嵌入到目标中时,schema 类型将被封装在一个不区分大小写的
enum
中,使用提供的schemaNamespace
作为enum
名称。
ⓘ 请注意
无论您将模式类型放在何处,任何包含生成的 操作模型或使用您模式的自定义 标量,枚举或输入 对象类型的模式都需要引用它。
模式模块
对于大多数项目,我们建议创建一个“模式模块”来存放您的模式类型。这使您可以在项目扩大的同时共享生成的模型。您可以使用 .swiftPackageManager
或 .other
选项来创建一个模式模块。
采用这种方法,您的模式类型将作为模块中提供的 schemaNamespace
作为模块名称的使用中的顶级符号。
对于单个目标项目配置,将此包链接到您的项目目标。对于多模块项目配置,您需要将此包链接到任何包含生成的 操作 模型或直接使用模式类型的模块。
💡 提示
大多数依赖管理器(例如,SPM 和 Cocoapods)可以自动将您的生成文件包含在模块的目录中。这意味着当生成文件添加或从生成模块中删除时,它们会自动关联到您的项目。
.swiftPackageManager
如果您的项目使用 SPM,.swiftPackageManager
选项是生成模式类型的最快、最方便的方法。
使用此 moduleType
,代码生成引擎可以自动化创建一个作为 SPM 包的模式模块。将使用提供的 schemaNamespace
作为包名称生成一个 Package.swift
文件。
除了生成的类型之外,您还可以在生成的 SPM 包的 Sources
文件夹中包含其他 Swift 文件,它们将自动包含在模式模块中。
.other
如果您使用任何您的项目正在使用的包管理器或构建系统(例如,.other
选项允许您生成要包含在您自己定义的模块中的模式类型。这可以与任何包管理器或构建系统一起使用。您还可以将这些文件包含在一个用于您模块的手动创建的 Xcode 目标中。
ⓘ 请注意
当使用 .other
选项时,用户定义的模块文件名必须与提供的 schemaNamespace
完全一致。
将模式类型嵌入到目标中
您还可以直接在项目中现有的目标中包含模式类型。虽然我们仍然建议对于大多数项目使用单独的模式模块,但这允许您在更高级的、自定义的使用案例中使用 Apollo。
采用这种方案,架构类型被一个不区分大小写的enum
封装起来,并使用提供的schemaNamespace
作为enum
名称。这作为一个命名空间,可以防止生成的类型和其他嵌入在内的目标类型之间的命名冲突。
对于多模块项目配置,您需要将包含嵌入架构类型的目标链接到任何包含生成操作模型的模块中,或者直接使用架构类型。
.embeddedInTarget(name: String)
要将架构类型嵌入到自己的目标中,请将.embeddedInTarget(name: String)
选项作为output.schemaTypes.moduleType
属性的值。
💡 提示
使用此选项会使您负责将生成的文件添加到您选择的目标或模块中。
如果您的目标是Xcode目标,您需要在代码生成引擎创建或删除文件时手动添加或从项目导航器中删除它们。