xcodebuild说不包含方案


125

我有一个古玩问题。

我有一个我一直在研究的项目,并且总是从XCode IDE构建的,并且运行良好。现在,我要设置Bamboo来构建项目,并因此从命令行进行构建。

问题是,如果我从GIT中检出我的代码,然后使用xcodebuild进行构建,则表明找不到该方案,但是如果我打开该项目,则将进行构建,如果我再尝试从命令行再次进行构建使用相同的命令,它可以工作。

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


只是注意到,当我在xcode中打开项目时,创建了一个.xcscheme文件,但是在xcuserdata / username.xcuserdatad文件夹中...但是我不明白为什么该方案在users文件夹下“生成”了..我怎么了将用竹子来处理
Zac Tolley

Answers:


186

关于.xcscheme文件,您绝对处于正确的轨道上-在设置自己的项目时出现了此问题!

对于后代,或者至少有人从搜索中获取信息,这里有两个版本:“我很忙,所以请事实”,以及更多涉及的讨论和理由。这两个版本都假定您尝试从Workspace文件进行构建。如果不是,那么我道歉,因为这主要适用于基于工作空间的项目。

精简版“修复”版本

根本原因是Schemes的默认行为是保持方案为“私有”,直到将它们明确标记为共享为止。如果是命令行启动的构建,则Xcode UI永远不会运行,并且xcoderun工具没有自己的Scheme缓存可以使用。目标是生成,共享和提交您要Bamboo运行的方案:

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

更深入的讨论和理由

Xcode 4引入了工作区和方案,作为一种方法来帮助解决一些固有的混乱,这些混乱是与Xcode项目的布线,构建目标以及一起构建配置的机制打交道的。工作区本身具有一组自己的配置数据,这些数据描述了它包含的每个较小的数据“框”,并充当附加.xcodeproj文件的框架以及一组共享到每个开发人员机器或CI系统的共享配置数据的框架。 。 这既是工作区的强大功能,也有陷阱-有1种方法可以让人们1​​00%正确地配置事物,但将其放置在错误的容器中,或者2)放置在正确的容器中,但配置不当,从而呈现数据系统其他部分无法访问!

Xcode 4方案的默认行为是在将项目添加到Workspace文件时自动生成新方案。那些已经添加了几个.xcodeproj文件的人可能已经注意到,您的方案列表很快变得不规则,尤其是在添加,删除然后再读入同一工作区的项目文件中。自动生成或手动创建的所有方案默认为仅对当前用户可见的“私有”方案,即使.xcuserdata文件已提交了项目的数据和配置。这是该隐秘构建错误的根本原因,xcodebuild的Bamboo报告–因为Bamboo通过命令行而不是Xcode UI操作该构建,所以Schemes没有机会自动生成,而仅依赖那些在工作区本身中定义。

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

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

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

  1. Xcode UI神奇地处理的某些自动化任务无法通过Xcodebuild CLI使用。
  2. 您可以将方案和构建配置数据附加到“容器层次结构”中的许多地方-确保将数据保存在正确的容器(工作区,项目和/或构建目标)中
  3. 考虑一下xcodebuild工具可能在容器层次结构中的何处寻找配置数据。可以从哪里开始使用--workspace或--project参数作为一个很好的指示。

“共享”框已被选中...现在呢?

我在自己的Bamboo实例上遇到了相同的问题;事实证明,在我的存储库中提交的方案已过时,并且最新版本的命令行工具无法正常处理。既然以前存在过,我仔细检查了设置以确保没有明显的自定义方案,删除并重新创建该方案以确保将其标记为“ Shared”,并将新的.xcscheme文件重新提交给资料库。

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


这实际上为我解决了一个随机的xcodebuild错误,该错误未返回任何错误,但退出代码为65。结果是,将容器设置为项目而不是工作空间本身,将其更改并解决了问题。谢谢。
西蒙·李

谢谢!这正是我想要的解决方法。
raidfive

我的测试和存档选项被禁用是因为这个原因。我已经检查了我的计划是共享的。仍然无法通过bot进行构建。我可以在本地进行构建,但是正如我提到的那样,我无法对其进行存档。您是否认为这与这个问题有关
Alix

谢谢!将方案容器设置到我的工作区可解决TeamCity构建遇到的问题。
表格

如何从此消息中找到模式。我正好收到此消息。[xcodebuild:错误:名为“ jamesAppV2”的工作区不包含名为“”的方案。“ -list”选项可用于在工作区中找到方案的名称。]
Qadir Hussain

52

像这样调试问题:

xcodebuild -list

或者如果您使用的是工作区(例如带有吊舱)

xcodebuild -workspace MyProject.xcworkspace -list

如果您的方案未列出,请像这样修复:

在此处输入图片说明


共享这些方案可以使它们出现在xcodebuild -list...谢谢!
Dan Rosenstark

35

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

但是要考虑很多“ 如果...会怎样

  • 如果由于某种原因您不能修改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文件来创建这些文件。


1
万一其他人偶然发现了这个问题,似乎recreate_user_schemes无法正确处理测试目标。我已经提交了关于它的错误报告
Matt Kantor 2014年

我写了关于它的博客。nsbogan.com/xcode/2014/05/29/share-xcode-schemes。不幸的是,单元测试的问题仍然没有解决。
i4niac

好吧,我尝试了这种解决方案。但是当我运行时,xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"我得到了“方案<IDEScheme:0x7fc9ea5e5fd0:'Finance'>进行构建和存档,但是运行目标<IDERunDestination:0x7fc9eb47c6c0:'iPad 2'>不是部署平台,因此该操作不应该具有被允许”。但是当我打开的XCode一切工作正常
ІгарЦімошка

2
archive操作始终涉及签名,并且目的地必须设置为真实设备。在您的情况下,目的地是iPad 2,我认为这是模拟器,因此无法存档。您的命令中缺少一个重要的选项,那-sdk iphoneos就是先尝试一下,看看它如何进行。当您从Xcode IDE运行它时,可能将目标设置为,iOS Device或者可能插入了真实设备,因此将其设置为目标。这就是为什么可以从IDE进行存档的原因。命令行更“笨拙”,默认情况下有时可以使用“错误”选项,因此您需要更加具体。
i4niac 2014年

1
应该对此进行更多投票-谢谢!使用Swift框架的Calabash项目无法使用XCode6.1.1进行构建,因为您必须从一个方案中进行构建。这个宝石真棒。
大卫


3

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


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项目名称。


0

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


0

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

导航到Product> Scheme>Manage Schemes

在此处输入图片说明

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

在此处输入图片说明

图片取自本文https://developer.nevercode.io/docs/sharing-ios-project-schemes


0

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

在此处输入图片说明

,并fastlane lanes正确显示所有车道,包括所有方案:

在此处输入图片说明

,但fastlane gym仅显示主要方案(不显示开发和测试方案):

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

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


0

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

  1. 选择您想要的方案
  2. 按“编辑”
  3. 选中“共享”框

方案编辑现在包含共享框

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.