为啥 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/ 目录中查找重复文件!这是在以下情况下引起的:​​

您在 Xcode 中将 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 进行编译

为啥无法在 iTunes Connect 中添加构建版本?

在 swift 包管理器中添加 Apollo 的代码生成构建脚本时出错

为啥 Apollo/GraphQL 返回一个不可扩展的对象?

为啥我在 XCode 项目中看不到我的构建阶段选项卡?

为啥我在刷新页面时没有显示来自 apollo 服务器的数据?