这是一个完全公平的问题,因为 Xcode 方案的记录还不够彻底,并且方案给人一种有点神奇的感觉,直到您看到它们如何与整个构建过程挂钩。
根据您正在寻求的解决方法,听起来好像您需要将一个方案提升为“共享”,以便自动化工具(或其他开发人员)不必首先打开您的项目并等待 Xcode 自动生成默认值方案。这是开发人员的一个完全正常的“询问”,他们试图让他们的 Xcode 项目与持续集成系统或作用于 Xcode 4 或 Xcode 5 项目的其他命令行工具一起工作。好消息是,有 Xcode 原生的方法来配置您的项目,而不必求助于混乱或容易出错的解决方法。
TL;DR 版本:
方案的默认 Xcode 行为是将它们视为特定于开发人员的设置,而不与其他开发人员或工具共享。我们需要将您的项目方案提升为“共享”并将这些更改提交到您的版本控制系统:
- 从彻底检查您的项目开始。
- 导航 Xcode 的菜单:产品 > 方案 > 管理方案...菜单选项
-
取消选中“自动创建方案”在方案表的左上角,
-
选中“共享”复选框旁边应该提供给所有开发人员用户和构建系统的方案。
- 最后将所有项目更改提交回版本控制系统。
这将使使用该项目的所有开发人员共享一个单一方案,无论 OS X 用户名如何,并使其能够通过以下方式进行无人值守构建:xcodebuild
或者选择的构建工具将有一个可以使用的方案。
...现在,为好奇的人提供更长的答案
在我们深入探讨您的直接问题之前,首先介绍一些背景知识:
Target:应用程序、静态库、捆绑包,或者更一般地说,是由源代码、资产、plist、构建设置和项目中包含的其他文件构建的“产品”。当通过 Xcode 的“运行”按钮或通过命令行工具调用构建操作时,会生成此“产品”xcodebuild
构建配置:一组命名的构建设置,可以通过人类可读的标签进行识别。默认情况下,所有 Xcode 项目都以“调试”配置开始,该配置生成具有最大透明度的构建目标,帮助开发人员调试其应用程序,以及“发布”配置,该配置会剥离生成的诊断信息并优化构建以减少它的大小。一些开发人员选择根据其团队的需求创建其他配置:可能会创建“Ad-Hoc”,以便可以更改签名身份和配置文件设置,以便通过 Ad-Hoc 配置文件对应用程序进行代码签名以进行安装。 “AppStore”或“Distribution”是其他项目中可能会看到的其他常见自定义构建配置。
Action:支持产品开发、诊断和测试所涉及的不同阶段的一组相关活动。截至撰写本文时,有六个操作:“构建”、“运行”、“测试”、“配置文件”、“分析”和“存档”。作为开发人员,您最常使用的两个是“构建”和“运行”。
构建方案:Xcode 4 的发明,用于管理指定构建目标的项目构建目标依赖关系、构建并行化选项。每个方案都允许开发人员为项目生命周期的每个操作(“构建”、“运行”等)精确选择一个构建配置(例如“调试”或“发布”),并定义相关的其他行为或选项与该特定操作。例如,方案中的“Profile”操作允许开发人员选择在 Instruments.app 中分析代码时默认加载哪个诊断工具。
记住这些定义,让我们回到您的问题:
我如何模拟打开 xcode 或以其他方式从命令行定义方案?
非常简单:您不需要做任何事情,有一个 Xcode 原生机制可以使方案可用,我们只需要进行一些小的方案重新配置即可让您启动并运行,然后将这些更改提交到版本控制(我是在本答案的其余部分中,将其称为“SCM”)。
您所面临的行为是 Xcode 在持久项目设置方面的默认项目行为。默认情况下,许多内容都被视为开发人员特定的设置,并驻留在一组映射到打开 Xcode 项目本身的帐户的特定用户名的文件中(稍后会详细介绍)。管理这些设置的策略可以归结为以下规则:Xcode 设置被视为“开发人员私有,直到明确提升为共享”。尽管这种方法存在于 Xcode 4 之前的 Xcode 版本中,但直到引入方案作为调用构建的主要工具时,这种方法才导致开发团队及其持续集成系统出现问题。
方案出现,并将 Xcode 早期版本中的大量设置屏幕合并到一个编辑器窗口中,开发人员可以在其中查看应用程序每个不同操作阶段的最高级别设置:
- 运行“Build”操作时,可以定义需要构建哪些目标,或者 Xcode 是否应尝试自行识别构建依赖项。
- 对于“运行”操作,选择应使用哪个构建配置以及要使用哪个调试器。
- 对于“测试”操作,选择应使用哪个构建配置以及应使用哪些测试类和测试数据包来测试应用程序行为。
- ...等等...还有很多其他高级设置,但我将把探索它们作为读者的练习...或者有机会提出另一个问题!
在每种情况下,这些设置都会产生某种级联效应 - 选择“调试”配置会在应用程序中保留尽可能多的诊断数据,以帮助开发人员跟踪问题的根源,这反过来又会调用“调试”特定的配置构建目标本身中配置的构建设置也可以运行“调试”特定脚本或启用“调试”特定设置。
当然,这些选择需要保存在某个地方,以便它们可以在开发会话之间或在 Xcode 决定崩溃的罕见情况下保留。 “开发人员私有直至晋升”的行为占据主导地位,这些方案设置保留在 .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
它将按照您的指示重置您的结帐,但因为您已提交一个方案,所以它将具有可以使用的构建操作。
尝试一下,让我们知道事情进展如何,以及您在此过程中是否遇到任何后续问题或问题。