Apollo iOS 1.7 迁移指南
从 1.6 到 1.7
本指南描述了将代码从版本 1.6 迁移到版本 1.7 的过程Apollo iOS。如果您使用的是其他版本,请遵循相关的迁移指南。
受影响用户
版本 1.7 是一个次要版本升级,大多数用户不需要迁移。
- 对于使用 Apollo Codegen CLI 运行代码生成的用户,此版本将是一个无缝升级,无需对现有代码进行任何更改。
- 对于直接使用 ApolloCodegenLib 从 Swift 可执行文件运行代码生成的用户,需要简单的迁移。
虽然我们努力使次要版本的升级路径无缝,但这些改进不可能不要求进行迁移。对于受影响的用户,请遵循此迁移指南以升级到 1.7。
ApolloCodegenLib
现在使用 Swift Concurrency
为了提高代码生成的性能,ApolloCodegenLib
现在使用了 async/await
。代码生成现在是并行化,对于拥有大量 GraphQL 文件的用户应该会更快完成。
这意味着入口函数,ApolloCodegen.build(with configuration:)
现在是一个 async
函数。您需要将此函数的调用点用 async/await
改写。在大多数情况下,这需要最少的代码更改。
在 Swift 可执行文件中使用 async/await
本迁移指南将提供一个示例,说明如何迁移使用swift-argument-parser的Swift可执行目标的迁移方法。虽然您可以使用ApolloCodegenLib
并无需它构建Swift可执行目标,但推荐使用swift-argument-parser进行使用。
为了迁移您的代码,您需要做几处修改
- 将您的
ParsableCommand
更改为AsyncParseableCommand
- 将您的
run()
函数async
- 在ApolloCodegen.build(with configuration:)函数调用中使用
await
考虑以下示例可执行程序
v1.6 CustomCodegenScript.swift
import Foundationimport ApolloCodegenLibimport ArgumentParser@mainstruct CustomCodegenScript: ParsableCommand {func run() throws {let codegenConfiguration = ApolloCodegenConfiguration(schemaNamespace: "MySchema",input: ApolloCodegenConfiguration.FileInput(schemaPath: "./myschema.graphqls",operationSearchPaths: ["./GraphQLFiles/**/*.graphql"]),output: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: ./Generated/Schema,moduleType: .swiftPackageManager),operations: .inSchemaModule))try ApolloCodegen.build(with: codegenConfiguration)}}
您可以将这个可执行命令支持Swift Concurrency,将其更改为
v1.7 CustomCodegenScript.swift
import Foundationimport ApolloCodegenLibimport ArgumentParser@mainstruct CustomCodegenScript: AsyncParsableCommand {func run() async throws {let codegenConfiguration = ApolloCodegenConfiguration(schemaNamespace: "MySchema",input: ApolloCodegenConfiguration.FileInput(schemaPath: "./myschema.graphqls",operationSearchPaths: ["./GraphQLFiles/**/*.graphql"]),output: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: ./Generated/Schema,moduleType: .swiftPackageManager),operations: .inSchemaModule))try await ApolloCodegen.build(with: codegenConfiguration)}}
将main.swift
的使用替换为@main
注意在上面的示例中,命令结构体使用了@main
注解。某些项目可能会在main.swift
文件中运行根命令。
v1.6 main.swift
import Foundationimport ApolloCodegenLibimport ArgumentParserstruct CustomCodegenScript: ParsableCommand {func run() throws {let codegenConfiguration = ApolloCodegenConfiguration(schemaNamespace: "MySchema",input: ApolloCodegenConfiguration.FileInput(schemaPath: "./myschema.graphqls",operationSearchPaths: ["./GraphQLFiles/**/*.graphql"]),output: ApolloCodegenConfiguration.FileOutput(schemaTypes: ApolloCodegenConfiguration.SchemaTypesFileOutput(path: ./Generated/Schema,moduleType: .swiftPackageManager),operations: .inSchemaModule))try ApolloCodegen.build(with: codegenConfiguration)}}CustomCodegenScript.main()
main.swift
文件的使用与AsyncParsableCommand
不兼容。您需要:
- 将
main.swift
文件的名称更改为您的命令名称,例如:CustomCodegenScript.swift
- 将
@main
注解添加到您的可执行程序根命令中 - 从脚本中删除对
main()
函数的调用。
标记为@main
的命令的run()
函数将在您运行Swift可执行目标时自动调用。