xcodebuild说不包含方案

时间:2013-01-16 22:18:44

标签: xcode xcodebuild bamboo

我有一个古玩问题。

我有一个项目,我一直在使用并始终使用XCode IDE构建,并且工作正常。现在我正在设置Bamboo来构建项目,因此我正在从命令行构建它。

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

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

10 个答案:

答案 0 :(得分:180)

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

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

简明'修复它'版本

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

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

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

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

    xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug
    

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

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

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

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

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

答案 1 :(得分:49)

调试这样的问题:

xcodebuild -list

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

xcodebuild -workspace MyProject.xcworkspace -list

如果你的方案未列出如此修复:

enter image description here

答案 2 :(得分:34)

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

但是有很多" ifs "考虑

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

Ruby& xcodeproj gem

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

顺便说一句,这是CocoaPods用来搞乱Xcode项目和工作空间的宝石。

所以安装它

sudo gem install xcodeproj

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

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

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

答案 3 :(得分:9)

好的我知道它2分钟后但我发现另一个堆栈溢出说该方案必须设置为共享... Where does Xcode 4 store Scheme Data?

答案 4 :(得分:3)

该方案缺失的一个常见原因是忘记将提交推送到原点。如果您收到丢失的方案消息,则应首先验证该方案是否已共享,然后验证您是否已提交更改并将其推送到源服务器。

答案 5 :(得分:1)

我在实施CI时遇到了这个错误。除了我使用Gitlab自己的CI工具之外,上面的问题与我的问题相同。你可以检查Bamboo中是否有这样的文件。
我通过对gitlab-ci.yml文件进行一些更改来解决它 在您通过共享提供scheme可用之后。在Xcode中转到Products>Scheme>Manage Scheme并检查共享以进行分享
更改

  

到处设置绝对路径。
  例如。xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
  在这里,您需要使用您的路径更改/path/to/your/project/,并使用您的项目名称更改testDemo

答案 6 :(得分:0)

遇到同样的问题,但在使用xcode作为主要项目的子项目进行构建时。在xcode中独立构建子项目 - 之后此错误消失。

答案 7 :(得分:0)

我遇到了这个问题,即使这里的一些答案确实提供了解决方案,我也觉得不太清楚。因此,我将再添加一个。简而言之,如何从excode共享模式。

导航到Product> Scheme> Manage Schemes

enter image description here

然后将显示一个方案列表,每个方案表示是否共享。只需检查您要共享的内容(对于开发和产品版本可能会有所不同)

enter image description here

本文https://developer.nevercode.io/docs/sharing-ios-project-schemes

中的图片

答案 8 :(得分:0)

我想为与该线程相关的案例添加解决方案。这是供您克隆现有项目的,您已经共享了您需要的所有方案:

enter image description here

,用const pc1 = new RTCPeerConnection(null); const pc2 = new RTCPeerConnection(null); async function call(){ const offer = await pc1.createOffer(); pc1.setLocalDescription(offer); pc2.setRemoteDescription(offer); const answer = await pc2.createAnswer(); pc2.setLocalDescription(answer); pc1.setRemoteDescription(pc2.localDescription); } async function showVideo(){ const config={audio:true,video:true}; stream = await navigator.mediaDevices.getUserMedia(config); pc1.addStream(stream); } 正确显示所有车道,包括所有方案:

enter image description here

,但是fastlane lanes仅显示主要方案(不包括开发和测试方案):

enter image description here

解决方案是取消选中fastlane gym中未列出的方案的共享选项,然后然后再次进行检查。它将为这些方案生成.xcscheme:

enter image description here

现在,如果您使用fastlane gym进行检查,将列出所有方案:

enter image description here

然后,您应该将那些.xcshemes文件提交到存储库中,以便其他克隆项目的开发人员可以获取这些文件。

答案 9 :(得分:0)

对于使用Xcode 11.4尝试在方案中查找“共享”按钮的任何人,它现在已移至单个方案中。

  1. 选择所需的方案
  2. 按“编辑”
  3. 选中“共享”框

Scheme Edit Contains Shared Box Now