xcodebuild说不包含scheme
我有一个古怪的问题。
我有一个我一直在从XCode IDE构build的项目,它工作正常。 现在我正在build立Bamboo来build立这个项目,并且正在从命令行构build它。
问题是,如果我检查我的代码出GIT,然后使用xcodebuild来build立它说,该scheme不能find,但如果我打开该项目,它build立,如果我然后尝试从命令行再次build立它使用相同的命令,它的工作原理。
当我打开这个项目或者我正在做一些愚蠢的事情时,XCode究竟能做些什么,或许我的.gitignore文件中排除了我不应该做的事情?
对于.xcscheme文件,你肯定是在正确的轨道上 – 我在设置自己的项目时出现了这个问题!
对于后人来说,或者至less有任何人通过search来到这里,这里有两个版本的东西 – “我很忙,所以只是事实请你”的版本和更多的参与讨论和理由。 这两个版本都假设您正在尝试从Workspace文件构build; 如果你不是那么我的道歉,因为这主要适用于基于工作区的项目。
简明的“修复它”版本
根本原因是scheme的默认行为是保持scheme“私人”,直到他们被明确标记为共享。 在命令行启动构build的情况下,Xcode UI永远不会运行,而且xcoderun工具没有自己的可以使用的caching。 目标是生成,分享和提交您想让Bamboo运行的计划:
- 在代码的干净的工作副本上,打开项目的工作区。
- 从产品菜单中select计划>pipe理scheme…。
- 出现为该项目定义的scheme列表。
- find计划Bamboo试图运行
- 确保为该scheme选中“共享”框,并将“容器”设置设置为工作区而不是项目文件本身。
- 点击“确定”closures“pipe理scheme”表单。
- 在WorkspaceName.xcworkspace / xcshareddata / xcschemes的项目中创build了一个新的.xcscheme文件。
- 提交这个文件到你的仓库并运行一个Bamboo build。
深入的讨论和理由
Xcode 4引入了Workspaces和Schemes作为一种方法来帮助尝试和驯服一些处理与Xcode项目相关的线程机制,构build目标和构buildconfiguration所固有的混乱。 工作空间本身具有自己的一组configuration数据,它描述了它包含的每个较小的“数据箱”,并作为一个框架来附加.xcodeproj文件和一组共享的configuration数据,镜像到每个开发者机器或CI系统。 这既是工作空间的威力,也是工作空间的缺陷 – 有很多方法可以正确configuration事物,但是放在错误的容器中,或者放在正确的容器中,但configuration不当,从而渲染数据系统的其他部分无法访问!
Xcode 4scheme的默认行为是在项目添加到Workspace文件时自动生成新scheme。 那些已经添加了几个.xcodeproj文件的人可能已经注意到,你的scheme列表很快就会变得不守规矩,特别是当项目文件被添加,然后被删除,然后读取到同一个工作区。 即使使用项目的数据和configuration提交.xcuserdata文件,所有自动生成或手动创build的scheme都默认为仅对当前用户可见的“私有”scheme。 这是造成这个神秘的构build错误的根本原因来自xcodebuild的Bamboo报告 – 因为Bamboo通过命令行操作构build而不是Xcode UI,所以它没有机会自动生成Schema,只依赖那些在工作区本身中定义。 假设您已经使用如下命令将Bambooconfiguration为从工作区构build:
xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug
xcodebuild将在<'workspace'参数值> / xcshareddata / xcschemes中查找文件<'scheme'参数值> .xcscheme。
显然有很多方法可以configurationBamboo和一个工作区,所以请记住,您的独特configuration可能无法将100%映射到此处显示的内容。 关键要点:
- Xcode UI神奇地处理某些自动化任务不能通过Xcodebuild CLI获得。
- 您可以将scheme和构build数据附加到“容器层次结构”中的许多位置 – 确保将数据放在正确的容器(工作区,项目和/或构build目标)
- 考虑容器层次结构中的xcodebuild工具可能在寻找configuration数据; 它将开始寻找的一个很好的指标是基于使用'-workspace'或'-project'参数。
“共享”框已经被选中了……现在呢?
我在自己的Bamboo实例上遇到了同样的问题; 事实certificate,在我的存储库中提交的scheme已经过时,最新版本的命令行工具没有正确处理它。 既然这个以前就存在了,我通过设置来确保没有任何关于该scheme的明显定制,删除并重新创build了保证我将其标记为“共享”的scheme,并将新的.xcscheme文件重新发送到库。
如果一切看起来不错,重build它并不能解决问题,请仔细检查容器设置 – 将该scheme附加到层次结构中错误的容器上真的很容易!
像这样debugging问题:
xcodebuild -list
或者如果你正在使用一个工作区(例如与豆荚)
xcodebuild -workspace MyProject.xcworkspace -list
如果你的scheme没有列出如下所示的修复:
大多数的答案会build议你使用Xcode共享你的scheme,然后提交更改回购。 这当然是有效的,但只有当你有权访问源代码并有权进行修改时,以及其他一些假设。
但是还有一些“ 假设 ”要考虑
- 如果由于某种原因无法修改Xcode项目呢?
- 如果您在CI服务器上自动创build一个新scheme会怎么样?
这实际上经常发生。 如果使用testing自动化框架(如Calabash),通常最终会复制一个现有的目标,并自动复制一个scheme,即使原始scheme是新scheme,也不共享新scheme。
Ruby&xcodeproj gem
我会推荐使用xcodeproj Ruby的gem。 这是一个非常酷的开源工具,可以帮助您自动执行大量与Xcode相关的任务。
顺便说一下,这是CocoaPods用来解决你的Xcode项目和工作空间的gem。
所以安装它
sudo gem install xcodeproj
然后编写一个简单的Ruby脚本来重新共享所有的scheme,为此目的,gem具有recreate_user_schemes方法
#!/usr/bin/env ruby require 'xcodeproj' xcproj = Xcodeproj::Project.open("MyProject.xcodeproj") xcproj.recreate_user_schemes xcproj.save
它不只是将用户文件夹中的scheme文件复制到xcshareddata / xcschemes ,它还通过parsingpbxproj文件来首先创build这些文件。
好吧,我知道它的2分钟后,但我发现另一个堆栈溢出,说该scheme必须设置为共享… Xcode 4存储计划数据?
该计划失踪的一个常见原因是忘记将提交推到原点。 如果您收到遗漏的计划消息,则应首先validation该计划是否已共享,然后确认已提交更改并将其推送到原始服务器。
得到了同样的问题,但在build设与Xcode作为主要子项目。 在xcode独立build立的子项目 – 之后,这个错误消失。
我在执行CI时遇到这个错误。除了我使用Gitlab自己的CI工具外,上面的问题和我的问题是一样的。您可以检查Bamboo中是否有这样的文件。
我通过对gitlab-ci.yml
文件进行一些修改来解决这个问题。
在你通过分享制定你的scheme
之后。 在Xcode转到Products>Scheme>Manage Scheme
并检查共享共享。
变化
设置绝对path到处。
例如。xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
在这里你需要用你的path和testDemo
来改变/path/to/your/project/
你的项目名称。