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运行的计划:

  1. 在代码的干净的工作副本上,打开项目的工作区。
  2. 从产品菜单中select计划>pipe理scheme…。
  3. 出现为该项目定义的scheme列表。
  4. find计划Bamboo试图运行
  5. 确保为该scheme选中“共享”框,并将“容器”设置设置为工作区而不是项目文件本身。
  6. 点击“确定”closures“pipe理scheme”表单。
  7. 在WorkspaceName.xcworkspace / xcshareddata / xcschemes的项目中创build了一个新的.xcscheme文件。
  8. 提交这个文件到你的仓库并运行一个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%映射到此处显示的内容。 关键要点:

  1. Xcode UI神奇地处理某些自动化任务不能通过Xcodebuild CLI获得。
  2. 您可以将scheme和构build数据附加到“容器层次结构”中的许多位置 – 确保将数据放在正确的容器(工作区,项目和/或构build目标)
  3. 考虑容器层次结构中的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/你的项目名称。