从终端定义xcode phonegap项目中的方案

时间:2013-12-19 19:13:50

标签: bash cordova xcodebuild

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:13)

这是一个完全公平的问题,因为Xcode方案有点不完全记录,并且方案有一种神奇的感觉,直到你看到它们如何挂钩整个构建过程。

根据您正在寻找的解决方法,听起来好像您需要推广一个方案,以便共享"共享"这样自动化工具(或其他开发人员)就不必首先打开你的项目并等待Xcode自动生成默认方案。这是完全正常的问题'来自开发人员试图使他们的Xcode项目与持续集成系统或与Xcode 4或Xcode 5项目上的其他命令行工具一起工作。好消息是,有Xcode本地方式来配置您的项目,而不必采用凌乱或容易出错的解决方法。

TL; DR版本:

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

  1. 从干净的项目结帐开始。
  2. 导航Xcode的菜单:产品>方案>管理方案...... 菜单选项
  3. 在方案表的左上角取消选中'自动创建方案'
  4. 检查共享'该方案旁边的复选框应该对所有开发人员用户和构建系统可用。
  5. 最后将所有项目更改提交回您的版本控制系统。
  6. 这将使所有使用此项目的开发人员共享一个Scheme,无论OS X用户名如何,并且使得通过xcodebuild或所选构建工具的无人参与构建将具有可以使用的方案。 / p>

    ...现在,好奇的

    的答案更长

    在我们深入研究您的直接问题之前,首先要了解一些背景知识:

    目标:应用,静态库,捆绑包或更常见的产品'根据项目中包含的源代码,资产,plists,构建设置和其他文件构建。这个'产品'当通过Xcode" Run""""""按钮或通过命令行工具xcodebuild

    构建配置:一组命名的构建设置,可由人类可读的标签识别。默认情况下,所有Xcode项目都以" Debug"生成具有最大透明度的构建目标的配置,帮助开发人员调试他们的应用程序和发布"发布"删除此诊断信息的结果构建的配置,并优化构建以减小其大小。一些开发人员选择根据团队的需求创建其他配置:" Ad-Hoc"可能会创建签名标识和配置文件设置,以便通过Ad-Hoc配置文件对应用程序进行代码签名以进行安装。 "苹果商店"或"发行"是其他项目中可能会看到的其他常见自定义构建配置。

    行动:一系列相关活动,支持产品开发,诊断和测试中涉及的不同阶段。截至撰写本文时,有六个动作:" Build"," Run"," Test"," Profile",&#34 ;分析"和"存档"。作为开发人员,您最常使用的两个是" Build"和"运行"。

    构建方案: Xcode 4发明,用于管理项目构建目标依赖项,为指定的构建目标构建并行化选项。每个Scheme允许开发人员为每个Action选择一个Build配置(例如" Debug"或" Release")(" Build"," Run& #34;等)项目的生命周期以及定义与该特定Action相关的其他行为或选项。例如," Profile"方案中的操作允许开发人员在Instruments.app中分析代码时默认选择将加载哪个诊断工具。

    考虑到这些定义,让我们回到你的问题:

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

    非常简单:您不需要这样做,有一个Xcode本机机制可以使方案可用,我们只需要做一些小的方案重新配置来启动并运行然后将这些更改提交到版本控制(我将在本答复的其余部分中将其称为“SCM'”。

    当涉及到持久化项目设置时,您面临的行为是Xcode的默认项目行为。默认情况下,许多内容被认为是特定于开发人员的设置,并且驻留在一组文件中,这些文件映射到打开Xcode项目本身的帐户的特定用户名(稍后会详细介绍)。管理这些设置的策略可以简化为Xcode设置被认为是开发人员私有的规则,直到明确宣传为共享'。尽管在Xcode 4之前的Xcode版本中存在这种情况,但直到引入Schemes作为调用构建的主要工具时,这种方法才导致开发团队及其持续集成系统出现问题。

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

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

    在每种情况下,这些设置都会产生级联效果 - 选择"调试"配置尽可能多地在应用程序中保存诊断数据,以帮助开发人员跟踪问题的根源,这反过来会调用" Debug"在Build Target本身中配置的特定构建设置,也可以运行" Debug"特定脚本或启用" Debug"具体设置。

    当然,这些选择需要在某个地方生存,以便它们可以在开发会话之间或在Xcode决定崩溃的罕见情况下持久存在。 "开发者私有的行为直到晋升为止#34;至高无上,这些方案设置一直存在于" xcuserdata" .xcodeproj文件本身中的文件夹 - 对于那些作为.xcworkspace的一部分驻留的项目,这仍然适用。

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

    1. 从Xcode切换到Finder,然后导航到项目的结帐目录。
    2. 右键单击项目的.xcodeproj文件,然后选择“显示包内容'”。如果您使用工作区,仍然选择包含项目文件的.xcodeproj,而不是.xcworkspace本身
    3. 导航到" xcuserdata"。
    4. 根据参与此项目的开发人员数量或具有针对此项目提交的不同用户名的不同计算机的数量,显然可以拥有多个.xcuserdatad文件夹。

      1. 选择与您的OS X用户名匹配的文件夹。对我来说,我的OS X用户名是' bmusial'所以我会选择' bmusial.xcuserdatad'文件夹中。
      2. 导航到' xcschemes'文件夹中。
      3. 观察您有两个文件:" [TARGET NAME] .xcscheme"和" xcschemenamagement.plist"其中包含有关方案顺序的信息以及是否应自动生成方案。
      4. <哈哈哈!方案被视为开发人员私有数据,并在项目首次启动时自动生成!

        这种认识开始成为我们需要做的核心 - 将这个方案从特定于开发人员的xcuserdata文件夹迁移到所有开发人员共享的东西,禁用自动方案生成以防止其他人陷入陷阱在未来,并将这些更改提交回您的SCM。切换回Xcode,让我们重新配置一些东西:

        1. 导航Xcode的菜单:产品&gt;方案&gt;管理方案...... 菜单选项
        2. 在方案表的左上角取消选中&#39;自动创建方案&#39;
        3. 检查共享&#39;该方案旁边的复选框应该对所有开发人员用户和构建系统可用。
        4. 切换回Finder窗口并上升两级以返回.xcodeproj文件夹(包含&x 39; xcuserdata&#39;文件夹)的内容。请注意,您现在拥有了一个&x; xcshareddata&#39;夹。此文件夹包含&#39; xcschemes&#39;包含我们刚刚共享的方案的文件夹以及我们自己的xcuserdata文件夹中的.xcscheme现在已经消失。我们刚刚将您的私有方案推广为一个共享的公共方案,可供所有开发人员和工具使用,甚至是那些从未直接启动过Xcode项目的人。

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

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

          请试一试,让我们知道事情的进展情况,以及您是否遇到任何后续问题或问题。

答案 1 :(得分:5)

您可能还会发现ruby gem xcodeproj很有用。它可以创建方案而无需打开xcode。

您可以阅读更多相关信息here.

对于phonegap / cordova,将share_schemes.rb脚本保存在cordova项目的脚本目录中。

#!/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平台时,您的方案都将由此脚本创建。