我有一个奇怪的问题。
我有一个项目,以前都是在 XCode IDE 中构建,一直很好用。现在我正在设置 Bamboo 来构建该项目,因此从命令行构建它。
问题是,如果我从 GIT 检查出代码,然后使用 xcodebuild 来构建它,它会说找不到方案,但如果我打开项目,它就会构建,如果我再用相同的命令从命令行构建它,它就可以工作了。
XCode 在我打开项目时做了什么魔法?还是我做了什么蠢事,可能是排除了 .gitignore 文件中不应该排除的文件?
我有一个奇怪的问题。
我有一个项目,以前都是在 XCode IDE 中构建,一直很好用。现在我正在设置 Bamboo 来构建该项目,因此从命令行构建它。
问题是,如果我从 GIT 检查出代码,然后使用 xcodebuild 来构建它,它会说找不到方案,但如果我打开项目,它就会构建,如果我再用相同的命令从命令行构建它,它就可以工作了。
XCode 在我打开项目时做了什么魔法?还是我做了什么蠢事,可能是排除了 .gitignore 文件中不应该排除的文件?
关于.xcscheme文件,你的想法是正确的--我在设置自己的项目时遇到了这个问题!
为了后人考虑,或至少是任何通过搜索找到这里的人,这里提供两个版本的解决方案--一个是“我很忙,只需要事实”版本,另一个是更详细的讨论和解释。这两个版本都假定您正在尝试从Workspace文件构建;如果不是,则我道歉,因为这主要适用于基于workspace的项目。
简化版解决方法
根本原因是Scheme的默认行为是将Scheme保持“私有”,直到它们被明确标记为共享。对于命令行启动的构建,Xcode UI从未运行,xcoderun工具没有自己的缓存可用于工作。目标是生成、共享并提交您想要Bamboo运行的Scheme:
更深入的讨论和解释
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%映射到此处所呈现的内容。关键要点:
“共享”框已经被选中了...现在该怎么办?
我在自己的Bamboo实例上遇到了同样的问题;事实证明,提交到我的存储库中的方案已过时,并且最新版本的命令行工具不能优雅地处理它。由于这以前存在,我查看了设置,以确保方案中没有任何显眼的自定义内容,删除并重新创建方案,确保将其标记为“共享”,并将新的.xcscheme文件重新提交到存储库中。
如果一切看起来都很好,重建也无法解决问题,请再次检查容器设置-很容易将该方案附加到层次结构中错误的容器中!
像这样调试问题:
xcodebuild -list
如果您正在使用工作区(例如,使用 pods)
xcodebuild -workspace MyProject.xcworkspace -list
xcodebuild -list
中显示...谢谢! - Dan Rosenstark大多数答案都会建议您使用Xcode共享方案,然后提交更改到存储库。当然,这样做是有效的,但前提是您可以访问源代码并有权提交更改,还有其他一些假设条件。
但需要考虑一些“假设情况”
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文件来创建这些文件。
xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"
时,我得到了 'Scheme IDEScheme:0x7fc9ea5e5fd0:'Finance' 被要求构建和存档,但运行目标 <IDERunDestination:0x7fc9eb47c6c0:'iPad 2'> 不是部署平台,因此不应该允许此操作'。但是当我打开 XCode 时一切正常。 - Ігар Цімошкаarchive
操作通常需要签名,目标设备必须设置为真实设备。在你的情况下,目标设备是 iPad 2
,我认为它是模拟器,因此无法进行归档。你的命令中缺少一个重要的选项,那就是 -sdk iphoneos
。首先尝试这个选项,看看效果如何。当你从Xcode IDE运行它时,你可能已经将目标设备设置为iOS 设备
或者可能已经连接了真实设备,因此它被设置为目标设备。这就是为什么从IDE进行归档的原因。命令行更加"愚蠢",有时默认使用"错误"的选项,所以你需要更加具体。 - i4niac方案丢失的常见原因是忘记将提交推送到源。如果您收到方案丢失消息,请首先验证该方案是否共享,然后验证您已经提交并将其推送到源服务器。
产品
> 模式
> 管理模式
。
然后您将看到一个方案列表,每个方案都标注为共享或非共享。只需勾选您想要共享的方案(对于开发和生产构建可能是不同的方案)
本文中的图片来自于https://developer.nevercode.io/docs/sharing-ios-project-schemes
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
更改为您的项目名称。
我遇到了同样的问题,但是在将其作为主项目的子项目进行构建时出现了问题。在独立的Xcode中构建子项目后,这个错误就消失了。