对于 .xcscheme 文件,您绝对走在正确的轨道上——我在设置自己的项目时出现了这个问题!
对于后代,或者至少是通过搜索到达这里的任何人,这里有两个版本——“我很忙,所以请只提供事实”版本和更复杂的讨论和理由。这两个版本都假设您正在尝试从工作区文件进行构建;如果您不是,那么我很抱歉,因为这主要适用于基于工作区的项目。
精简“修复”版本
根本原因是方案的默认行为是保持方案“私有”,直到它们被明确标记为共享。在命令行启动构建的情况下,Xcode UI 永远不会运行,并且 xcoderun 工具没有自己的可使用的方案缓存。目标是生成、共享和提交您希望 Bamboo 运行的方案:
- 在代码的干净工作副本上,打开项目的工作区。
- 从产品菜单中选择方案 > 管理方案...。
- 将出现为项目定义的方案列表。
- 找到 Bamboo 正在尝试运行的计划
- 确保选中该方案的“共享”框,并将“容器”设置设置为工作空间而不是项目文件本身。
- 单击“确定”关闭“管理方案”表。
- 已在您的项目中创建了一个新的 .xcscheme 文件,路径为 WorkspaceName.xcworkspace/xcshareddata/xcschemes。
- 将此文件提交到您的存储库并运行 Bamboo 构建。
更深入的讨论和基本原理
Xcode 4 引入了工作空间和方案,作为一种方法来帮助尝试和驯服一些固有的混乱,这些混乱是处理连接相关 Xcode 项目、构建目标和构建配置的机制所固有的。工作区本身有自己的一组配置数据,描述它包含的每个较小的数据“盒子”,并充当附加 .xcodeproj 文件的骨架和一组镜像到每个开发人员计算机或 CI 系统的共享配置数据。这既是工作空间的强大之处,也是它的陷阱——有 1) 有很多方法可以使事物配置 100% 正确,但放入错误的容器中,或者 2) 放入正确的容器中,但配置不正确,从而渲染数据系统的其他部分无法访问!
Xcode 4 方案的默认行为是在将项目添加到工作区文件时自动生成新方案。添加了多个 .xcodeproj 文件的人可能已经注意到,您的方案列表很快就会变得不规则,特别是在添加、删除项目文件,然后将其读取到同一工作区时。所有方案(自动生成或手动创建)默认为仅对当前用户可见的“私有”方案,即使 .xcuserdata 文件与项目的数据和配置一起提交也是如此。这是 Bamboo 从 xcodebuild 报告的神秘构建错误的根本原因——因为 Bamboo 通过命令行而不是 Xcode UI 来操作构建,所以它没有机会自动生成方案,并且仅依赖于那些在工作区本身中定义。假设您已将 Bamboo 配置为使用如下命令从工作区构建:
xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug
xcodebuild 查找位于 /xcshareddata/xcschemes 处的文件 .xcscheme。
显然,有多种方法可以配置 Bamboo 和工作区,因此请记住,您的独特配置可能无法 100% 映射到此处提供的内容。关键要点:
- Xcode UI 神奇地处理的某些自动化任务无法通过 Xcodebuild CLI 执行。
- 您可以将方案和构建配置数据附加到“容器层次结构”中的许多位置 - 确保您的数据最终出现在正确的容器中(工作区、项目和/或构建目标)
- 考虑 xcodebuild 工具可能在容器层次结构中的哪个位置寻找配置数据;开始查找位置的一个很好的指标是基于“-workspace”或“-project”参数的使用。
“共享”框已被选中...现在怎么办?
我在自己的 Bamboo 实例上遇到了同样的问题;事实证明,在我的存储库中提交的方案已经过时,并且最新版本的命令行工具无法正常处理它。由于这个问题以前就存在,我查看了设置以确保该方案没有任何明显的自定义内容,删除并重新创建了该方案,确保我将其标记为“共享”,并将新的 .xcscheme 文件重新提交到存储库。
如果一切看起来都不错并且重建不能解决问题,请仔细检查该容器设置 - 很容易将该方案附加到层次结构中的错误容器!