xcodebuild提示没有包含scheme。

127

我有一个奇怪的问题。

我有一个项目,以前都是在 XCode IDE 中构建,一直很好用。现在我正在设置 Bamboo 来构建该项目,因此从命令行构建它。

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

XCode 在我打开项目时做了什么魔法?还是我做了什么蠢事,可能是排除了 .gitignore 文件中不应该排除的文件?


刚刚注意到在Xcode中打开项目时会创建一个.xcscheme文件,但是在xcuserdata/username.xcuserdatad文件夹中生成了该方案,但我不明白为什么该方案会在用户文件夹下“生成”... 我该如何在Bamboo中处理这个问题。 - Zac Tolley
10个回答

190

关于.xcscheme文件,你的想法是正确的--我在设置自己的项目时遇到了这个问题!

为了后人考虑,或至少是任何通过搜索找到这里的人,这里提供两个版本的解决方案--一个是“我很忙,只需要事实”版本,另一个是更详细的讨论和解释。这两个版本都假定您正在尝试从Workspace文件构建;如果不是,则我道歉,因为这主要适用于基于workspace的项目。

简化版解决方法

根本原因是Scheme的默认行为是将Scheme保持“私有”,直到它们被明确标记为共享。对于命令行启动的构建,Xcode UI从未运行,xcoderun工具没有自己的缓存可用于工作。目标是生成、共享并提交您想要Bamboo运行的Scheme:

  1. 在干净的代码副本上打开您的项目工作区。
  2. 从产品菜单中选择 Scheme > Manage Schemes...
  3. 出现了为该项目定义的Scheme列表。
  4. 找到Bamboo尝试运行的Scheme
  5. 确保勾选该Scheme的“Shared”框,并将“Container”设置为Workspace而不是项目文件本身。
  6. 点击“确定”以关闭“Manage Schemes”窗口。
  7. 在WorkspaceName.xcworkspace/xcshareddata/xcschemes下创建了一个新的.xcscheme文件。
  8. 将这个文件提交到您的代码库并运行Bamboo构建。

更深入的讨论和解释

Xcode 4引入了工作区(Workspaces)和方案(Schemes),作为一种帮助对付与处理相关的Xcode项目、构建目标和构建配置时固有的混乱的方式。工作区本身具有其自己的配置数据,描述它包含的每个小“盒子”的数据,并充当连接.xcodeproj文件和一组共享配置数据的框架,这些数据会被镜像到每个开发人员机器或CI系统中。这既是工作区的强大之处,也是其缺点--有很多方法可以将事物正确地配置100%,但放到错误的容器中,或者将其放到正确的容器中,但配置不正确,从而使其他部分无法访问数据!

Xcode 4方案的默认行为是在添加到Workspace文件中的项目时自动生成新方案。那些添加了几个.xcodeproj文件的人可能已经注意到,随着项目文件的添加、删除和重新添加到同一个工作区,他们的方案列表很快变得混乱不堪。所有方案,自动生成的或手动创建的,默认都是“私有”方案,仅对当前用户可见,即使.xcuserdata文件在提交项目的数据和配置时也是如此。这就是Bamboo从xcodebuild报告的那个神秘构建错误的根本原因--因为Bamboo通过命令行而不是Xcode UI操作构建,所以它没有机会自动生成方案,并且仅依赖于在工作区中定义的方案。假设您已经配置了Bamboo以使用类似于以下命令的方式从工作区构建:

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

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

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

  1. Xcode UI自动处理的某些自动化任务无法通过Xcodebuild CLI使用。
  2. 您可以将方案和构建配置数据附加到“容器层次结构”的许多位置-确保您的数据出现在正确的容器(工作区、项目和/或构建目标)中
  3. 考虑xcodebuild工具可能正在容器层次结构的哪个位置查找配置数据;根据使用“-workspace”或“-project”参数的情况,估计它将从哪里开始查找是一个好的指示。

“共享”框已经被选中了...现在该怎么办?

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

如果一切看起来都很好,重建也无法解决问题,请再次检查容器设置-很容易将该方案附加到层次结构中错误的容器中!


这实际上为我解决了一个随机的xcodebuild错误,该错误没有返回任何错误,但是退出代码为65。原来容器设置为项目而不是工作区本身,更改后问题得到解决。谢谢。 - Simon Lee
我的测试和归档选项被禁用了,是因为这个原因吗?我已经检查过我的方案是共享的,但仍然无法通过机器人构建。我能够在本地构建,但正如我所提到的,我无法进行归档。你认为这与这个问题有关吗? - Alok C
谢谢!将方案容器设置为我的工作区解决了我在TeamCity构建中遇到的问题。 - Form
如何从此消息中找到模式。我正好收到了这条消息。[xcodebuild:错误:名为“jamesAppV2”的工作区不包含名为“”的方案。可以使用“-list”选项查找工作区中方案的名称。] - Qadir Hussain
我遇到了一个问题,xcodebuild说我的方案没有配置测试操作:https://stackoverflow.com/questions/48394612/xcodebuild-failing-on-teamcity-build-agent-scheme-is-not-currently-configured-f。我正在构建一个项目,而不是一个工作区。但我去看了一下,发现我的方案没有共享,所以我尝试了一下并检查了生成的文件。问题解决了!谢谢! - Tom Bogle
显示剩余4条评论

56

像这样调试问题:

xcodebuild -list

如果您正在使用工作区(例如,使用 pods)

xcodebuild -workspace MyProject.xcworkspace -list

如果您的方案未列出,请按如下方式进行修复:

将方案共享可以让它们在xcodebuild -list中显示...谢谢! - Dan Rosenstark

36

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

但需要考虑一些“假设情况”

  • 如果由于某种原因不能修改Xcode项目怎么办?
  • 如果在CI服务器上自动创建新方案怎么办?
    这种情况经常发生。如果使用测试自动化框架(如Calabash),通常会复制现有目标,这将自动复制一个方案,而新方案即使原始方案是共享的也不会被共享。

Ruby & xcodeproj gem

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

顺便说一下,这个gem被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
我写了一篇博客。http://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" 时,我得到了 'Scheme IDEScheme:0x7fc9ea5e5fd0:'Finance' 被要求构建和存档,但运行目标 <IDERunDestination:0x7fc9eb47c6c0:'iPad 2'> 不是部署平台,因此不应该允许此操作'。但是当我打开 XCode 时一切正常。 - Ігар Цімошка
2
archive操作通常需要签名,目标设备必须设置为真实设备。在你的情况下,目标设备是 iPad 2,我认为它是模拟器,因此无法进行归档。你的命令中缺少一个重要的选项,那就是 -sdk iphoneos。首先尝试这个选项,看看效果如何。当你从Xcode IDE运行它时,你可能已经将目标设备设置为iOS 设备或者可能已经连接了真实设备,因此它被设置为目标设备。这就是为什么从IDE进行归档的原因。命令行更加"愚蠢",有时默认使用"错误"的选项,所以你需要更加具体。 - i4niac
1
这个应该得到更多的赞 - 谢谢!使用Swift框架的Calabash项目在XCode6.1.1中无法构建,因为你必须从一个方案进行构建。这个宝石真是太棒了。 - David
这也是Bazel创建的XCode项目的解决方案。感谢您的提示和代码片段! - jcanizales

9

3

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


1
我遇到了这个问题,即使这里的一些答案提供了解决方案,但我并没有找到它非常清楚明了。所以我要再添加一个。简而言之,如何从 Xcode 共享模式。
导航至 产品 > 模式 > 管理模式

enter image description here

然后您将看到一个方案列表,每个方案都标注为共享或非共享。只需勾选您想要共享的方案(对于开发和生产构建可能是不同的方案)

enter image description here

本文中的图片来自于https://developer.nevercode.io/docs/sharing-ios-project-schemes


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

我想为我的情况添加解决方案,与此线程相关。这个是给那些克隆现有项目的人,所有你需要的方案已经被共享:

enter image description here

使用 fastlane lanes 命令,可以正确显示所有的 lane 和 scheme:

enter image description here

但是fastlane gym只显示主要方案(而不是开发和测试方案):

enter image description here

解决方案是取消未被fastlane gym列出的方案的共享选项,然后再次勾选它。这将为这些方案生成.xcscheme文件:

enter image description here

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

enter image description here

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


0

我遇到了同样的问题,但是在将其作为主项目的子项目进行构建时出现了问题。在独立的Xcode中构建子项目后,这个错误就消失了。


0

对于使用Xcode 11.4的任何人,如果想要在方案中找到“共享”按钮,现在已经移动到了各自的方案中。

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

Scheme Edit Contains Shared Box Now


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接