为啥 Apollo 无法在 Xcode 中构建 - 只能有一个名为 ...的片段?
Posted
技术标签:
【中文标题】为啥 Apollo 无法在 Xcode 中构建 - 只能有一个名为 ...的片段?【英文标题】:Why does Apollo fail to build in Xcode - There can only be one fragment named ...?为什么 Apollo 无法在 Xcode 中构建 - 只能有一个名为 ...的片段? 【发布时间】:2019-04-16 20:57:53 【问题描述】:使用:
Xcode 10.1 阿波罗 1.9.2 CocoaPods 1.5.3 来自 Apollo 的最新构建阶段脚本在 Xcode 的构建阶段,当它执行 Apollo GraphQL API 脚本时,我收到重复片段和操作的错误,a-la:
"There can only be one fragment named..."
或
"There can only be one operation named..."
项目将拒绝构建。
清理构建文件夹将允许您在错误再次出现之前再次构建或运行项目。
【问题讨论】:
【参考方案1】:问题是 bash find
命令在本地 DerivedData/
目录中查找重复文件!这是在以下情况下引起的:
DerivedData/
目录设置为 Relative
您使用的是 Apollo 提供的默认构建阶段脚本
从这里更改 Apollo 的构建阶段脚本:
$APOLLO_FRAMEWORK_PATH/check-and-run-apollo-cli.sh codegen:generate --queries="$(find . -name '*.graphql')" --schema=schema.json API.swift
到这里:
$APOLLO_FRAMEWORK_PATH/check-and-run-apollo-cli.sh codegen:generate --queries="$(find . -name '*.graphql' -not -path "*DerivedData/*")" --schema=schema.json API.swift
细节:
如果您不关心派生数据的去向,请将位置设置从Relative
更改为 Default
(或 Apollo 未查看的任何目录)。您可以在此处找到设置:Xcode > Preferences > Locations > Derived Data
如果您希望将派生数据保留在原处,请更改传递给 apollo-cli 的查询中的 bash find 命令,以通过附加 -not -path "*DerivedData/*"
排除 DerivedData/
文件夹。您可以通过转到 Project Root > (Target Project) > Build Phases > Generate Apollo GraphQL API 找到该脚本(您应该在安装步骤中添加,请参阅 here)。让它看起来像这样:
$APOLLO_FRAMEWORK_PATH/check-and-run-apollo-cli.sh codegen:generate --queries="$(find . -name '*.graphql' -not -path "*DerivedData/*")" --schema=schema.json API.swift
您可能需要最后一次从项目文件夹中删除 DerivedData/
文件夹,并且最后一次清理 (Command + Shift + K
) 并没有什么坏处。
【讨论】:
以上是关于为啥 Apollo 无法在 Xcode 中构建 - 只能有一个名为 ...的片段?的主要内容,如果未能解决你的问题,请参考以下文章
从 ruby gem 导出的 GraphQL 查询无法在 Xcode 项目上使用 Apollo 进行编译
在 swift 包管理器中添加 Apollo 的代码生成构建脚本时出错