我有一个古玩问题。
我有一个我一直在研究的项目,并且总是从XCode IDE构建的,并且运行良好。现在,我要设置Bamboo来构建项目,并因此从命令行进行构建。
问题是,如果我从GIT中检出我的代码,然后使用xcodebuild进行构建,则表明找不到该方案,但是如果我打开该项目,则将进行构建,如果我再尝试从命令行再次进行构建使用相同的命令,它可以工作。
当我打开项目时XCode在做什么,或者我在做一些愚蠢的事情,也许排除了我不应该在.gitignore文件中删除的文件?
我有一个古玩问题。
我有一个我一直在研究的项目,并且总是从XCode IDE构建的,并且运行良好。现在,我要设置Bamboo来构建项目,并因此从命令行进行构建。
问题是,如果我从GIT中检出我的代码,然后使用xcodebuild进行构建,则表明找不到该方案,但是如果我打开该项目,则将进行构建,如果我再尝试从命令行再次进行构建使用相同的命令,它可以工作。
当我打开项目时XCode在做什么,或者我在做一些愚蠢的事情,也许排除了我不应该在.gitignore文件中删除的文件?
Answers:
关于.xcscheme文件,您绝对处于正确的轨道上-在设置自己的项目时出现了此问题!
对于后代,或者至少有人从搜索中获取信息,这里有两个版本:“我很忙,所以请事实”,以及更多涉及的讨论和理由。这两个版本都假定您尝试从Workspace文件进行构建。如果不是,那么我道歉,因为这主要适用于基于工作空间的项目。
精简版“修复”版本
根本原因是Schemes的默认行为是保持方案为“私有”,直到将它们明确标记为共享为止。如果是命令行启动的构建,则Xcode UI永远不会运行,并且xcoderun工具没有自己的Scheme缓存可以使用。目标是生成,共享和提交您要Bamboo运行的方案:
更深入的讨论和理由
Xcode 4引入了工作区和方案,作为一种方法来帮助解决一些固有的混乱,这些混乱是与Xcode项目的布线,构建目标以及一起构建配置的机制打交道的。工作区本身具有一组自己的配置数据,这些数据描述了它包含的每个较小的数据“框”,并充当附加.xcodeproj文件的框架以及一组共享到每个开发人员机器或CI系统的共享配置数据的框架。 。 这既是工作区的强大功能,也有陷阱-有1种方法可以让人们100%正确地配置事物,但将其放置在错误的容器中,或者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%映射到此处显示的内容。关键要点:
“共享”框已被选中...现在呢?
我在自己的Bamboo实例上遇到了相同的问题;事实证明,在我的存储库中提交的方案已过时,并且最新版本的命令行工具无法正常处理。既然以前存在过,我仔细检查了设置以确保没有明显的自定义方案,删除并重新创建该方案以确保将其标记为“ Shared”,并将新的.xcscheme文件重新提交给资料库。
如果一切看起来不错并且重建仍不能解决问题,请仔细检查容器设置-将方案附加到层次结构中的错误容器真的很容易!
像这样调试问题:
xcodebuild -list
或者如果您使用的是工作区(例如带有吊舱)
xcodebuild -workspace MyProject.xcworkspace -list
如果您的方案未列出,请像这样修复:
xcodebuild -list
...谢谢!
大多数答案都建议您使用Xcode共享方案,然后将更改提交到存储库。当然,这可行,但前提是您有权访问源代码并有权提交更改以及其他一些假设。
但是要考虑很多“ 如果...会怎样 ”
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文件来创建这些文件。
recreate_user_schemes
无法正确处理测试目标。我已经提交了关于它的错误报告。
xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"
我得到了“方案<IDEScheme:0x7fc9ea5e5fd0:'Finance'>进行构建和存档,但是运行目标<IDERunDestination:0x7fc9eb47c6c0:'iPad 2'>不是部署平台,因此该操作不应该具有被允许”。但是当我打开的XCode一切工作正常
archive
操作始终涉及签名,并且目的地必须设置为真实设备。在您的情况下,目的地是iPad 2
,我认为这是模拟器,因此无法存档。您的命令中缺少一个重要的选项,那-sdk iphoneos
就是先尝试一下,看看它如何进行。当您从Xcode IDE运行它时,可能将目标设置为,iOS Device
或者可能插入了真实设备,因此将其设置为目标。这就是为什么可以从IDE进行存档的原因。命令行更“笨拙”,默认情况下有时可以使用“错误”选项,因此您需要更加具体。
好的,我在2分钟后知道了它,但是我发现另一个堆栈溢出,该溢出表示该方案必须设置为共享... Xcode 4在哪里存储方案数据?
我在实施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
项目名称。
我遇到了这个问题,即使这里的一些答案确实提供了解决方案,我也不太清楚。因此,我将再添加一个。简而言之,如何从excode共享模式。
导航到Product
> Scheme
>Manage Schemes
然后,将显示一个方案列表,每个方案表示是否共享。只需检查您要共享的内容(对于开发和产品版本可能会有所不同)
图片取自本文https://developer.nevercode.io/docs/sharing-ios-project-schemes
我想为与该线程相关的案例添加解决方案。这是供您克隆现有项目的,您已经共享了所需的所有方案:
,并fastlane lanes
正确显示所有车道,包括所有方案:
,但fastlane gym
仅显示主要方案(不显示开发和测试方案):
解决方案是取消选中未列出的方案的共享选项fastlane gym
,然后再次进行检查。它将为这些方案生成.xcscheme:
现在,如果使用进行检查fastlane gym
,将列出所有方案:
然后,您应该将那些.xcshemes文件提交到存储库中,以便其他克隆项目的开发人员可以获取这些文件。