bash - 在终端的xcode phonegap项目中定义方案

标签 bash cordova xcodebuild

我正在编写一个脚本来存档phonegap项目的iOS部分。该脚本将擦除项目所在的目录,然后使用源代码管理中的最新代码重新填充该目录。然后运行$ phonegap local build ios以构建项目。但是,为了存档项目,我需要定义其方案。我尝试从命令行构建项目,但收到消息** BUILD FAILED **。截至目前,我已经打开了xcode项目(这是我找到的定义方案的唯一方法)的代码,然后在等待xcode发挥其魔力的同时睡眠30秒。我的问题是如何模拟打开xcode或从命令行定义方案。

在此先感谢您的帮助。

最佳答案

这是一个完全公平的问题,因为Xcode方案比完全记录的要少,并且在您看到它们如何成为整个构建过程的整体之前,该方案具有某种神奇的感觉。

根据您要寻找的解决方法,听起来好像您需要将方案提升为“共享”,以便自动化工具(或其他开发人员)不必首先打开您的项目并等待Xcode自动生成默认值方案。这是开发人员试图使其Xcode项目与Continuous Integration系统或作用于Xcode 4或Xcode 5项目的其他命令行工具一起工作的完全正常的“要求”。好消息是,有Xcode本地方法可以配置项目,而不必求助于混乱或容易出错的解决方法。

TL; DR版本:

方案的默认Xcode行为是将它们视为开发人员特定的设置,而不与其他开发人员或工具共享。我们需要将您的项目方案推广为“共享”,并将这些更改提交给您的版本控制系统:


从对项目进行彻底检出开始。
导航Xcode的菜单:产品>方案>管理方案...菜单选项
取消选中方案表左上角的“自动创建方案”,
选中应该对所有开发人员用户和构建系统都可用的方案旁边的“共享”复选框。
最后,将所有项目更改提交回版本控制系统。


这将使使用此项目的所有开发人员都能共享一个Scheme,无论使用OS X用户名如何,并使其通过xcodebuild或所选的构建工具进行无人值守的构建都可以使用一个方案。

...现在,对于好奇心更长的答案

在我们深入探讨您的直接问题之前,请先了解一些背景知识:

目标:应用程序,静态库,捆绑软件,或更笼统地说是根据源代码,资产,原始文件,构建设置以及项目中包含的其他文件构造的“产品”。通过Xcode的“运行”按钮或命令行工具xcodebuild调用构建操作时,将生成此“产品”

构建配置:一组命名的构建设置,可以通过人类可读的标签来识别。默认情况下,所有Xcode项目均以“调试”配置开始,该配置生成具有最大透明度的构建目标,以帮助开发人员调试其应用程序;而“发布”配置则剥离该诊断信息的生成结果并优化该构建,以减少它的大小。一些开发人员选择根据其团队的需求来创建其他配置:可能会创建“ Ad-Hoc”,以便可以更改“签名身份”和“供应配置文件”设置,以通过Ad-Hoc供应配置文件对应用进行代码签名。 “ AppStore”或“ Distribution”是其他项目中可能看到的其他常见自定义构建配置。

行动:一组相关的活动,支持产品开发,诊断和测试中涉及的不同阶段。截至撰写本文时,有六个操作:“构建”,“运行”,“测试”,“配置文件”,“分析”和“存档”。作为开发人员,您最常使用的两个选项是“ Build”和“ Run”。

构建方案:Xcode 4发明,用于管理项目构建目标的依赖关系,用于特定构建目标的构建并行化选项。每个方案都允许开发人员为项目生命周期的每个操作(“构建”,“运行”等)精确选择一个构建配置(例如“调试”或“发布”),并定义其他行为或相关选项该特定的操作。例如,通过使用方案中的“配置文件”操作,开发人员可以选择在Instruments.app中对代码进行性能分析时默认情况下将加载哪种诊断工具。

牢记这些定义,让我们回到您的问题:

如何模拟打开xcode或从命令行定义方案?

非常简单:您不需要执行任何操作,有一种Xcode本地机制可以使方案可用,我们只需要进行一些次要的方案重新配置就可以启动并运行,然后将这些更改提交给版本控制(我是在本答案的其余部分中将其称为“ SCM”)。

在持久化项目设置时,您面临的行为是Xcode的默认项目行为。默认情况下,许多东西被认为是特定于开发人员的设置,并且驻留在一组文件中,这些文件映射到打开Xcode项目本身的帐户的特定用户名(稍后对此进行介绍)。可以将管理这些设置的策略简化为以下规则:将Xcode设置视为“开发人员专用,直到明确升级为共享”。尽管在Xcode 4之前的Xcode版本中已经出现了这种情况,但是直到引入Schemes作为调用构建的主要工具之后,这种方法才导致开发团队及其持续集成系统出现问题。

出现了一些方案,并将早期Xcode的大量设置屏幕合并到一个编辑器窗口中,开发人员可以在该窗口中查看应用程序每个不同操作阶段的最高级别设置:


运行“ Build”操作时,可以定义需要构造的目标,或者Xcode是否应该尝试自行识别构建依赖项。
对于“运行”操作,选择应使用的构建配置以及要使用的调试器。
对于“测试”操作,选择应使用哪个构建配置以及应使用哪些测试类和测试数据包来测试应用程序行为。
...等等...还有许多其他高级设置,但我将继续探索它们,作为读者的练习...或一个提出另一个SO问题的机会!


在每种情况下,这些设置都会产生某种级联效应-选择“调试”配置会在应用程序中保留尽可能多的诊断数据,以帮助开发人员跟踪问题的根源,这又将调用特定于“调试”的信息在构建目标本身中配置的构建设置,也可以运行“调试”特定的脚本或启用“调试”特定的设置。

自然,这些选择需要放在某个地方,以便可以在开发会话之间或在Xcode决定崩溃的极少数情况下保留下来。 “开发人员处于私有状态,直到晋升”的行为至高无上,并且这些Scheme设置保留在.xcodeproj文件本身的“ xcuserdata”文件夹中-对于那些驻留在.xcworkspace中的项目,这仍然适用。

您可以在自己的项目中亲自查看。首先,请确保您使用的是干净版本的代码,然后打开Xcode项目或工作区,以确保在浏览项目文件时可以使用默认方案的个人版本:


从Xcode切换到Finder,然后导航到项目的检出目录。
右键单击您项目的.xcodeproj文件,然后选择“显示软件包内容”。如果使用工作区,请仍然选择包含项目文件的.xcodeproj,而不是.xcworkspace本身
导航到“ xcuserdata”。


根据参与该项目的开发人员数量或针对该项目提交的具有不同用户名的不同计算机的数量,显然可以有多个.xcuserdatad文件夹。


选择与您的OS X用户名匹配的文件夹。对我来说,我的OS X用户名是'bmusial',所以我将选择'bmusial.xcuserdatad'文件夹。
导航到“ xcschemes”文件夹。
观察到您有两个文件:“ [TARGET NAME] .xcscheme”和“ xcschemenamagement.plist”,其中包含有关方案顺序以及是否应自动生成方案的信息。


啊哈!方案被视为开发人员专用数据,并在项目首次启动时自动生成!

这种认识开始成为我们需要做的事情的核心-将该方案从开发人员专用的xcuserdata文件夹中迁移到所有开发人员之间共享的内容中,禁用自动方案生成以防止其他人陷入陷阱中将来,并将这些更改提交给您的SCM。切换回Xcode,让我们重新配置一些内容:


导航Xcode的菜单:产品>方案>管理方案...菜单选项
取消选中方案表左上角的“自动创建方案”,
选中应该对所有开发人员用户和构建系统都可用的方案旁边的“共享”复选框。


切换回Finder窗口,并转到两个级别,以返回.xcodeproj文件夹的内容(其中包含一个“ xcuserdata”文件夹)。请注意,您现在有了一个“ xcshareddata”文件夹。此文件夹包含一个“ xcschemes”文件夹,其中包含我们刚刚共享的方案,并且我们自己的xcuserdata文件夹中的.xcscheme现在不存在了。我们刚刚将您的私有计划升级为共享的,公开的计划,所有开发人员和工具都可以使用,即使从未直接启动Xcode项目的开发人员和工具也可以使用。

将我们所做的所有更改(会有一些新的文件夹和文件!)提交回SCM,以便每个人下次下次更新源代码时都收到相同的配置更改!

下次运行phonegap时,它将按照指示重置结帐,但是由于您已提交方案,因此它将具有可以使用的生成操作。

试试看,让我们知道事情的发展以及您在此过程中是否遇到任何后续问题。

关于bash - 在终端的xcode phonegap项目中定义方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20689850/

相关文章:

尽管 set -e 和/或 trap 处于事件状态,但未捕获 Bash 退出状态

bash - 如何让 `make` 提示用户输入密码并将其存储在 Makefile 变量中?

javascript - 如何使用sqlite在插入查询中获取插入的行id?

android - 在 Android 上运行或模拟的 PhoneGap CLI 错误

xcode - 从远程计算机使用Xcode

ios - xcodebuild 停留在协同设计上?如何禁用提示?

bash - 长文件减去短文件等于新文件遍历每一行

javascript - 将 Cordova camera.getPicture 文件传递​​到 AWS S3 (JS SDK)

xcodebuild 给出 “profiling: invalid magic number” ,不生成覆盖文件

linux - Unix/巴什 : Redirect results of find command so files are used as input for other command