xcodebuild说不包含方案

Zac*_*ley 120 xcode xcodebuild bamboo

我有一个古玩问题.

我有一个项目,我已经工作,并始终从XCode IDE构建,它工作正常.现在我正在设置Bamboo来构建项目,因此我正在从命令行构建它.

问题是,如果我从GIT中检查我的代码,然后使用xcodebuild来构建它,它说无法找到该方案,但如果我打开该项目,它会构建,如果我然后尝试从命令行再次构建它使用相同的命令,它的工作原理.

当我打开项目或者我做了一些愚蠢的事情时,XCode做了什么魔术,可能在我的.gitignore中排除了一个我不应该的文件?

Bry*_*ial 183

你肯定是关于.xcscheme文件的正确轨道 - 我在设置我自己的项目时出现了这个问题!

对于子孙后代,或至少从搜索到这里的人,这里有两个版本的东西 - "我很忙,所以只是请事实"版本和更多参与的讨论和理由.这两个版本都假设您正在尝试从Workspace文件构建; 如果你不是那么我道歉,因为这主要适用于基于工作空间的项目.

简明的"修复它"版本

根本原因是Schemes的默认行为是将方案保持为"私有",直到它们被明确标记为共享.在命令行启动的构建的情况下,Xcode UI永远不会运行,并且xcoderun工具没有自己的Schemes缓存可供使用.目标是生成,共享和提交您希望Bamboo运行的方案:

  1. 在干净的代码副本上,打开Project的工作区.
  2. 从产品菜单中选择Scheme> Manage Schemes ....
  3. 将显示为项目定义的方案列表.
  4. 找到方案Bamboo正在尝试运行
  5. 确保为该方案选中"共享"框,并将"容器"设置设置为工作区而不是项目文件本身.
  6. 单击"确定"以关闭"管理方案"表.
  7. 您的项目中已在WorkspaceName.xcworkspace/xcshareddata/xcschemes中创建了一个新的.xcscheme文件.
  8. 将此文件提交到您的存储库并运行Bamboo构建.

更深入的讨论和理由

Xcode 4引入了工作空间和方案,以帮助尝试和驯服处理与Xcode项目相关的机制,构建目标和构建配置所固有的一些混乱.工作区本身具有自己的一组配置数据,用于描述它包含的每个较小的"数据盒"数据,并充当附加.xcodeproj文件的框架和一组共享配置数据,这些数据被镜像到每个开发人员机器或CI系统. 这既是工作空间的力量和陷阱 - 有很多方法可以让人们1​​00%正确配置,但放入错误的容器或2)放入正确的容器,但配置不当因此呈现数据系统的其他部分无法访问!

Xcode 4方案的默认行为是在项目添加到Workspace文件时自动生成新方案.那些已经添加了几个.xcodeproj文件的人可能已经注意到你的方案列表很快变得难以驾驭,特别是当项目文件被添加,然后删除,然后被读回到同一个工作区.自动生成或手动创建的所有方案默认为仅对当前用户可见的"私有"方案,即使使用项目的数据和配置提交.xcuserdata文件也是如此.这是从xcodebuild报告的神秘构建错误的根本原因 - 因为Bamboo通过命令行而不是Xcode UI来操作构建,所以它没有机会让Schemes自动生成并且仅依赖于那些在工作区本身中定义.

xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug
Run Code Online (Sandbox Code Playgroud)

xcodebuild寻找文件<'scheme'参数值> .xcscheme存在于<'workspace'参数值>/xcshareddata/xcschemes.

显然,有一些方法可以配置Bamboo和工作区,因此请记住,您的唯一配置可能不会100%映射到此处显示的内容.关键要点:

  1. Xcode UI神奇地处理的某些自动化任务无法通过Xcodebuild CLI获得.
  2. 您可以将方案和构建配置数据附加到"容器层次结构"中的许多位置 - 确保您的数据在正确的容器(工作区,项目和/或构建目标)中结束
  3. 考虑xcodebuild工具可能在容器层次结构中查找配置数据的位置; 它将开始寻找的一个很好的指标是基于'-workspace'或'-project'参数的使用.

已经检查了"共享"框...现在是什么?

我在自己的Bamboo实例上遇到了同样的问题; 事实证明,在我的存储库中提交的方案已经过时,并且最新版本的命令行工具没有正常处理它.由于之前存在这种情况,我查看了设置,以确保没有任何关于该方案的明确定制,删除并重新创建该方案,确保我将其标记为"共享",并重新将新的.xcscheme文件重新提交给库.

如果一切看起来都很好并且重建它并不能解决问题,请仔细检查容器设置 - 很容易将该方案附加到层次结构中的错误容器中!


Rob*_*ert 52

像这样调试问题:

xcodebuild -list
Run Code Online (Sandbox Code Playgroud)

或者如果您正在使用工作区(例如使用pod)

xcodebuild -workspace MyProject.xcworkspace -list
Run Code Online (Sandbox Code Playgroud)

如果你没有列出方案,那么修复如下:

在此输入图像描述


i4n*_*iac 34

大多数答案建议您使用Xcode共享您的方案,然后将更改提交到repo.当然,这是有效的,但前提是您有权访问源代码并有权提交更改,以及其他一些假设.

但是需要考虑一些" 假设 "

  • 如果由于某种原因你无法修改Xcode项目怎么办?
  • 如果在CI服务器上自动创建新方案,该怎么办?
    这实际上经常发生.如果您使用测试自动化框架(如Calabash),您通常最终会复制现有目标,这会自动复制一个方案,并且即使原始方案是,也不会共享新方案.

Ruby&xcodeproj gem

我建议使用xcodeproj Ruby gem.这是一个非常酷的开源工具,可以帮助您自动执行大量与Xcode相关的任务.

顺便说一下,这是CocoaPods使用的宝石,可以搞乱你的Xcode项目和工作区.

所以安装它

sudo gem install xcodeproj
Run Code Online (Sandbox Code Playgroud)

然后编写一个简单的Ruby脚本来重新共享所有方案,gem 为此目的使用了recreate_user_schemes方法

#!/usr/bin/env ruby
require 'xcodeproj'
xcproj = Xcodeproj::Project.open("MyProject.xcodeproj")
xcproj.recreate_user_schemes
xcproj.save
Run Code Online (Sandbox Code Playgroud)

它不只是将用户文件夹中的方案文件复制到xcshareddata/xcschemes,它还首先通过解析pbxproj文件来创建这些文件.

  • `archive`动作总是涉及签名,目的地必须设置为真实设备.在你的情况下,目的地是"iPad 2",我认为它是模拟器,所以不可能存档.你的命令中缺少一个重要的选项,它是`-sdk iphoneos`首先尝试一下,看看它是怎么回事.当您从Xcode IDE运行它时,您可能将目标设置为"iOS Device",或者您可能已插入真实设备,因此将其设置为目标.这就是归档从IDE工作的原因.命令行更"哑",有时默认使用"错误"选项,因此您需要更具体. (2认同)

Zac*_*ley 9

好的,我知道它2分钟后但我发现另一个堆栈溢出,说该方案必须设置为共享... Xcode 4存储方案数据在哪里?