我有一个古玩问题。
我有一个项目,我一直在使用并始终使用XCode IDE构建,并且工作正常。现在我正在设置Bamboo来构建项目,因此我正在从命令行构建它。
问题是,如果我从GIT中检查我的代码,然后使用xcodebuild来构建它,它说无法找到该方案,但如果我打开该项目,它会构建,如果我然后再尝试从命令行使用相同的命令,它可以工作。
当我打开项目时,XCode做了什么魔术,或者我做了一些愚蠢的事情,可能在我的.gitignore中排除了我不应该写的文件?
答案 0 :(得分:180)
关于.xcscheme文件,你肯定是在正确的轨道上 - 我在设置自己的项目时出现了这个问题!
对于子孙后代,或至少从搜索到这里的人,这里有两个版本的东西 - "我很忙,所以只是事实请"版本和更复杂的讨论和理由。这两个版本都假设您正在尝试从Workspace文件构建;如果你不是我的道歉,因为这主要适用于基于工作空间的项目。
简明'修复它'版本强>
根本原因是,Schemes的默认行为是保持方案的私密性。直到他们被明确标记为共享。在命令行启动的构建的情况下,Xcode UI永远不会运行,xcoderun工具也没有自己的Schemes缓存可供使用。目标是生成,共享和提交您希望Bamboo运行的方案:
更深入的讨论和理由
Xcode 4引入了工作空间和方案,以帮助尝试和驯服一些混乱,这些混乱是处理与Xcode项目相关的机制,构建目标和一起构建配置所固有的。工作区本身具有自己的一组配置数据,用于描述每个较小的框'它包含的数据,并作为附加.xcodeproj文件和一组共享配置数据的框架,这些数据被镜像到每个开发人员机器或CI系统。 这既是工作空间的力量和陷阱 - 有很多方法可以让人们100%正确配置,但放入错误的容器或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%映射到此处显示的内容。关键要点:
'共享'框已被检查...现在是什么?
我在自己的Bamboo实例上遇到了同样的问题;事实证明,在我的存储库中提交的方案已经过时,并且最新版本的命令行工具没有优雅地处理它。由于此前存在,我查看了设置,以确保没有任何关于该方案的明确定制,删除并重新创建该方案,确保我将其标记为“共享'”并重新启动新的.xcscheme文件到存储库。
如果一切看起来都很好并且重建它并没有解决问题,请仔细检查容器设置 - 很容易将该方案附加到层次结构中的错误容器中!
答案 1 :(得分:49)
调试这样的问题:
xcodebuild -list
或者如果您正在使用工作区(例如使用pod)
xcodebuild -workspace MyProject.xcworkspace -list
如果你的方案未列出如此修复:
答案 2 :(得分:34)
大多数答案建议您使用Xcode共享您的方案,然后将更改提交到repo。当然,这是有效的,但前提是您有权访问源代码并有权提交更改,以及其他一些假设。
但是有很多" ifs "考虑
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
然后将显示一个方案列表,每个方案表示是否共享。只需检查您要共享的内容(对于开发和产品版本可能会有所不同)
本文https://developer.nevercode.io/docs/sharing-ios-project-schemes
中的图片答案 8 :(得分:0)
我想为与该线程相关的案例添加解决方案。这是供您克隆现有项目的,您已经共享了您需要的所有方案:
,用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);
}
正确显示所有车道,包括所有方案:
,但是fastlane lanes
仅显示主要方案(不包括开发和测试方案):
解决方案是取消选中fastlane gym
中未列出的方案的共享选项,然后然后再次进行检查。它将为这些方案生成.xcscheme:
现在,如果您使用fastlane gym
进行检查,将列出所有方案:
然后,您应该将那些.xcshemes文件提交到存储库中,以便其他克隆项目的开发人员可以获取这些文件。
答案 9 :(得分:0)