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

nea*_*ick 7 bash xcodebuild cordova

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

在此先感谢您的帮助.

Bry*_*ial 13

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

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

TL; DR版本:

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

  1. 从干净的项目结账开始.
  2. 导航Xcode的菜单:产品>方案>管理方案...菜单选项
  3. 取消选中方案表左上角的"自动创建方案",
  4. 选中应该提供给所有开发人员用户和构建系统的方案旁边的"共享"复选框.
  5. 最后将所有项目更改提交回版本控制系统.

这将使所有使用此项目的开发人员共享一个Scheme,无论OS X用户名如何,并使得无人参与的构建xcodebuild或选择的构建工具将有一个方案可以使用.

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

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

目标:应用程序,静态库,捆绑包或更一般地来说,是根据项目中包含的源代码,资产,plists,构建设置和其他文件构建的"产品".当通过Xcode的"运行"按钮或命令行工具调用构建操作时,会生成此"产品"xcodebuild

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

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

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

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

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

很简单:你不需要做任何一个,有一个Xcode本机机制可以使方案可用,我们只需要做一些小的方案重新配置,让你启动并运行然后将这些更改提交到版本控制(我是在本答案的其余部分将其称为"SCM").

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

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

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

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

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

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

  1. 从Xcode切换到Finder,然后导航到项目的结帐目录.
  2. 右键单击项目的.xcodeproj文件,然后选择"显示包内容".如果使用工作区,仍然选择包含项目文件的.xcodeproj,而不是.xcworkspace本身
  3. 导航到"xcuserdata".

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

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

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

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

  1. 导航Xcode的菜单:产品>方案>管理方案...菜单选项
  2. 取消选中方案表左上角的"自动创建方案",
  3. 选中应该提供给所有开发人员用户和构建系统的方案旁边的"共享"复选框.

切换回Finder窗口并上升两级以返回.xcodeproj文件夹(包含'xcuserdata'文件夹的文件夹)的内容.请注意,您现在有一个'xcshareddata'文件夹.此文件夹包含一个'xcschemes'文件夹,其中包含我们刚刚共享的方案,而我们自己的xcuserdata文件夹中的.xcscheme现已消失.我们刚刚将您的私有Scheme推广为一个共享的公共方案,可供所有开发人员和工具使用,甚至是那些从未直接启动Xcode项目的人员.

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

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

试一试,让我们知道事情是怎么回事,如果你遇到任何后续问题或问题.

  • 感谢您的回复 - OP的案例甚至不适用于我们,因为我们通过SSH运行它,因此xcode永远不会启动.我正在看到一个未来的尝试生成方案文件,存储它们并在适当的时间复制它们.... (2认同)

Con*_*nor 5

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

你可以在这里阅读更多相关信息.

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

#!/usr/bin/env ruby
# share_schemes.rb

require 'xcodeproj'
xcproj = Xcodeproj::Project.open("platforms/ios/MyProject.xcodeproj")
xcproj.recreate_user_schemes
xcproj.save
Run Code Online (Sandbox Code Playgroud)

然后添加一个钩子在config.xml中运行它.

<platform name="ios">
    <hook type="after_platform_add" src="scripts/share_schemes.rb" />
</platform>
Run Code Online (Sandbox Code Playgroud)

现在您不必打开xcode进行更改,也无需检查平台文件夹中的任何更改.每次添加ios平台时,您的方案都将由此脚本创建.