从终端在 xcode PhoneGap 项目中定义方案

2024-03-21

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

预先感谢您的任何帮助。


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

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

TL;DR 版本:

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

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

这将使使用该项目的所有开发人员共享一个单一方案,无论 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 项目或工作区,以确保当我们浏览您的项目文件时,您的个人版本的默认方案可用:

  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 现在已经消失了。我们刚刚将您的私有方案提升为共享的公共方案,所有开发人员和工具都可以使用该方案,甚至包括那些从未直接启动 Xcode 项目的开发人员和工具。

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

下次你跑步的时候phonegap它将按照您的指示重置您的结帐,但因为您已提交一个方案,所以它将具有可以使用的构建操作。

尝试一下,让我们知道事情进展如何,以及您在此过程中是否遇到任何后续问题或问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从终端在 xcode PhoneGap 项目中定义方案 的相关文章

  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • PhoneGap、getDeviceInfo 上的 EXC_BAD_ACCESS 的解决方法

    我遇到过EXC BAD ACCESS on getDeviceInfo对于应用程序 当升级到XCode 5 1并支持iOS 7 1 For XCode 5 1 和 iOS 7 1 它的内存管理非常严格 导致我在 iPhone 5s 上的 P
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • Ionic-Angular.js 拍照并发送到服务器:空图像

    因此 我设法使用自定义指令通过 Angular js 将图像上传到我的服务器 我还成功地实现了 Cordova 的相机功能 现在我尝试连接两者 但是当将图像发送到服务器时 它们被存储为空 我认为问题在于我使用输入字段来获取图像 并且它获取了
  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的
  • Jquery 移动应用程序的奇怪行为

    我创建了一个应用程序 其中包含多个主页按钮 单击其中一个按钮 我的应用程序将重定向到某个视图 其中包含 JQM 表单 JQM 日历 文本字段 按钮和数据库等 我的问题是 当我在 Android 设备上测试我的应用程序时 即使我没有使用任何图
  • 匹配模式后添加行[重复]

    这个问题在这里已经有答案了 我有一个文件说test具有以下值 Linux Solaris Fedora Ubuntu AIX HPUX 如何在匹配 AIX 的行后面添加一行系统主机名 如果我做 echo hostname gt gt tes
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 对目录中的所有文件执行命令

    有人可以提供执行以下操作的代码 假设有一个文件目录 所有这些文件都需要通过程序运行 该程序将结果输出到标准输出 我需要一个脚本 该脚本将进入一个目录 对每个文件执行命令 并将输出连接到一个大输出文件中 例如 要在 1 个文件上运行命令 cm
  • 服务器到 Phonegap 推送:SignalR 与 Azure 通知中心

    好吧 我在继续开发 Phonegap 应用程序时陷入了两难境地 对于实时事件通知 我应该使用 Azure 通知中心还是 SignalR 据我了解 SignalR 通过使用 Web Sockets 非常适合实时 Web 应用程序 而通知中心可
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具

随机推荐

  • 在 dplyr 中使用 select 函数时保留列标签

    我组合了多个数据集并仅保留特定列 但是 当我使用 dplyr 中的选择函数时 它不会保留原始列标签 在我的情况下为项目文本 导入数据后 我使用以下代码来选择要保留的变量 Wave1Data Clean lt select Wave1Data
  • 在Python中使用networkx绘制二部图[重复]

    这个问题在这里已经有答案了 我有一个二分图的 n1 n2 双邻接矩阵 A 矩阵 A 是 scipy sparse csc 矩阵 我想使用 Networkx 中的 A 绘制二分图 假设节点根据其称为 node class 的类标签进行着色 我
  • JetBrains Rider 在 Mac 上启用 ASP.NET MVC 迁移

    我在 macOS Mojave 上安装了 JetBrains Rider 2018 3 我创建了一个 ASP NET MVC 项目 安装了实体框架 6 2 我将连接字符串添加到 web config 中 但是 我不知道如何配置app con
  • Android 中的 USB 加密狗识别 - Beaglebone

    Issue Beaglebone 中的 Android JellyBean4 1 2 无法识别某些华为 USB Dongle 详细 我正在使用在 Android JellyBean4 1 2 上运行的 BeagleBone Huawei E
  • Android NDK调试:设备无法打开

    我现在正在尝试调试我的本机库一段时间 但它不起作用 本机代码可以工作并编译 但出于优化目的 我确实需要调试本机代码 我已经阅读并遵循了许多教程 例如教程1 http mhandroid wordpress com 2011 01 23 us
  • 从 JSON 文件读取数据

    假设我有一个 JSON 文件位于http www randomurl com jobs json http www randomurl com jobs json 它看起来像这样 jobs task turn burgers who Ann
  • 如何在多个环境中处理 OmniAuth 回调?

    我有一个应用程序专门使用 Facebook 作为身份验证提供程序 并已正确设置生产模式的回调 为了实现这一点 您需要为 Facebook 应用程序提供一个站点 URL 和一个用于回调的站点域 在我的例子中是http appname hero
  • Swift 中迭代对象类属性

    Swift 中有没有一种简单的方法来迭代类的属性 即我有一个 Person 类 它有 3 个属性 姓名 姓氏 年龄 有没有类似的东西 for attribute in Person println attribute attribute v
  • 如何在 CQL3 中使复合键列具有空列值

    这听起来可能很愚蠢 因为 SQL 的复合主键中没有空值 但只是想确认我们是否可以在 CQL3 中拥有相同的功能 因此 我们有一个像这样的表来存储宽行 CREATE TABLE keyspace12 colFamily1 id text co
  • 如何安全地实现Java插件安全?

    我正在设计一个用于在 Java 应用程序中加载 处理和支持插件的系统 我认为在部署之前对此绝对至关重要的一个功能是能够建立一个安全的环境 在该环境中插件仅限于允许其执行的操作 我无法理解如何以编程方式使用策略文件而不在启动时运行 Djava
  • 在 php 中创建一个 .sql 文件

    我使用下面的代码来获取 wp option 值 function option value change global wpdb myrows wpdb gt get results SELECT FROM wp options forea
  • 有什么区别?

    我注意到的用法
  • 如何使用 ReactJS 重新加载 iframe?

    我的 ReactJS 组件包含一个 iframe 为了响应外部页面中的事件 我需要重新加载 iframe 如果用户已导航到 iframe 中的另一个页面 我需要将其重置为首次加载该页面时的 URL 该网址可用于this props 我尝试过
  • 如何清除先前绘制的 Matplotlib 文本框?

    我可以在其中制作文本框matplotlib美好的 但我不知道如何从渲染图中删除它们 好像没有figure text clear or figure text visible False 绘制文本框后 这是怎么做到的 与传说不同的是 您似乎无
  • 更改配置单元中的列类型

    我昨天刚开始学习 hive 我一直致力于更改 hive 中列的类型 我想问列类型的更改是否对它们有某种限制 因为我只能进行特定类型的更改 例如我可以将 int 转换为 double string 转换为 double double 转换为
  • type.__setattr__ 与 object.__setattr__ 有什么不同?

    type setattr 用于类 基本上是元类的实例 object setattr 另一方面 用于类的实例 这是完全可以理解的 我没有看到这两种方法之间有显着差异 至少在Python级别 我注意到这两种方法使用相同的属性分配过程 如果我错了
  • core-js 安装后脚本错误失败

    当我尝试在现有的节点中安装节点模块时 我遇到以下错误Angular project 我正在尝试在 Windows 计算机 Win32 X64 中安装节点模块 gt email protected cdn cgi l email protec
  • 如何增加 Android Google Play 服务排行榜上的玩家得分?

    我阅读了有关的所有文档排行榜 https developers google com games services common concepts leaderboards在Google Play服务中 当我调用GameClient的sub
  • 如何在spark-jdbc应用程序中给出表名以读取RDBMS数据库上的数据?

    我正在尝试使用 Spark 读取 greenplum 数据库上存在的表 如下所示 val execQuery s select allColumns 0 as flagCol from schema table where period y
  • 从终端在 xcode PhoneGap 项目中定义方案

    我正在编写一个脚本来存档phonegap 项目的iOS 部分 该脚本会擦除项目所在的目录 然后使用源代码管理中的最新代码重新填充该目录 然后我跑 phonegap local build ios为了构建该项目 然而 为了归档该项目 我需要定