$ phonegap local build ios
来构建该项目。但是为了归档该项目,我需要定义其 scheme。我尝试从命令行构建该项目,但是我得到了消息 ** BUILD FAILED **。截至目前为止,我让代码打开 Xcode 项目(这是我找到的唯一定义 scheme 的方法),然后等待 30 秒,等待 Xcode 完成其工作。我的问题是:如何模拟打开 Xcode 或以其他方式从命令行定义 scheme?感谢您提前的任何帮助。
$ phonegap local build ios
来构建该项目。但是为了归档该项目,我需要定义其 scheme。我尝试从命令行构建该项目,但是我得到了消息 ** BUILD FAILED **。截至目前为止,我让代码打开 Xcode 项目(这是我找到的唯一定义 scheme 的方法),然后等待 30 秒,等待 Xcode 完成其工作。我的问题是:如何模拟打开 Xcode 或以其他方式从命令行定义 scheme?感谢您提前的任何帮助。
考虑到 Xcode 方案文档不够详细,而且方案有种神秘的感觉,直到你看到它们如何连接整个构建过程,这是一个完全公正的问题。
基于你正在寻找的解决方法,听起来你需要将方案提升为“共享”状态,以便自动化工具(或其他开发人员)无需先打开您的项目并等待Xcode自动生成默认方案。 这是从试图使其与持续集成系统或针对Xcode 4或Xcode 5项目操作的其他命令行工具一起使用的开发人员的完全正常的要求。 好消息是,有一些Xcode本地的方式可以配置您的项目,而无需诉诸混乱或容易出错的解决方法。
简短版本:
Xcode 默认行为是将方案视为特定于开发人员的设置,而不与其他开发人员或工具共享。 我们需要将项目的方案提升为“共享”并将这些更改提交到您的版本控制系统:
这将使单个方案在所有使用此项目的开发人员之间共享,而不管他们的 OS X 用户名如何,并使它成为通过xcodebuild
或首选构建工具进行未监视的构建的可用方案。
...现在,让我们看一下详细的答案:
在深入研究您直接的问题之前,先了解一些背景信息:
目标: 应用程序、静态库、捆绑包或更一般地说是从源代码、资产、plists、构建设置和其他文件中构建的“产品”。当调用构建操作时,无论是通过Xcode的“运行”按钮还是通过命令行工具xcodebuild
,都会生成这个“产品”。
构建配置: 一个由人类可读标签识别的构建设置的命名集合。默认情况下,所有Xcode项目都从“调试”配置开始,该配置生成具有最大透明度的构建目标,帮助开发人员调试应用程序,以及“发布”配置,该配置去除了结果构建的诊断信息并对构建进行了优化,以减小其大小。一些开发人员选择根据团队的需要创建其他配置:“Ad-Hoc”可能会被创建,这样可以更改签名证书和预配文件设置,以便使用 Ad-Hoc 预配文件安装应用程序。"AppStore" 或 "Distribution"是其他常见的自定义构建配置。
Action: 一组相关活动,支持产品开发、诊断和测试的不同阶段。截至撰写本文时,共有六个操作:“构建”、“运行”、“测试”、“分析”、“剖析”和“归档”。作为开发人员,你最常使用的是“构建”和“运行”。 Build Scheme: Xcode 4中管理项目构建目标依赖项和构建并行化选项的发明。每个Scheme允许开发人员为项目生命周期中的每个操作(如“构建”、“运行”等)选择一个构建配置(例如“Debug”或“Release”),以及定义与该特定操作相关的其他行为或选项。例如,Scheme中的“Profile”操作允许开发人员在Instruments.app中剖析代码时选择默认加载哪个诊断工具。 有了这些定义,让我们回到你的问题: 我该如何模拟打开Xcode,或者以其他方式定义Scheme呢? 非常简单:你不需要做任何事情,Xcode有一种原生机制可以使方案可用,我们只需要对方案进行一些微小的重新配置,即可让你开始运行并提交这些更改到版本控制系统中(我将在本答案的其余部分中将其称为“SCM”)。 你面临的问题是Xcode的默认项目行为,当涉及到持久化项目设置时。默认情况下,许多设置都被视为特定于开发人员的设置,并驻留在一组文件中,这些文件映射到打开Xcode项目本身的帐户的特定用户名(稍后会详细说明)。管理这些设置的策略可以概括为“ Xcode设置被认为是‘开发人员专用的,直到明确提升为共享的’”。虽然这在Xcode 4之前的版本中就已存在,但直到Scheme成为调用构建的主要工具,这种方法才会导致开发团队及其持续集成系统出现问题。 随着Scheme的出现,许多早期版本的Xcode中的设置屏幕被整合到一个单独的编辑器窗口中,开发人员可以查看应用程序每个不同操作阶段的最高级别设置:切换回Finder窗口,并上升两个级别,返回到.xcodeproj文件夹的内容(其中包含“xcuserdata”文件夹)。现在可以看到一个“xcshareddata”文件夹。该文件夹包含了我们刚才分享的方案的“xcschemes”文件夹,并且我们自己的xcuserdata文件夹中的.xcscheme已经消失。我们将您的私有方案提升为共享的、公共的方案,可供所有开发人员和工具使用,即使他们从未直接启动Xcode项目也是如此。
提交我们所做的所有更改(将会有一些新的文件夹和文件!)回到您的SCM,以便下次更新源代码时每个人都能收到相同的配置更改!
下次运行phonegap
时,它将按照您指示重置您的checkout,但因为您已经提交了一个方案,它将可以处理构建操作。
尝试一下并告诉我们情况如何,如果您在此过程中遇到任何后续问题或问题,请让我们知道。
#!/usr/bin/env ruby
# share_schemes.rb
require 'xcodeproj'
xcproj = Xcodeproj::Project.open("platforms/ios/MyProject.xcodeproj")
xcproj.recreate_user_schemes
xcproj.save
然后在您的config.xml中添加一个钩子来运行它。
<platform name="ios">
<hook type="after_platform_add" src="scripts/share_schemes.rb" />
</platform>
现在您不需要打开Xcode进行更改,也不需要检查平台文件夹中的任何更改。每次添加iOS平台时,此脚本将创建您的方案。