从终端在 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 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 关键字“if”如何测试一个值是真还是假?

    在 bash 脚本中 if 1 then echo Yes else echo No fi Output Yes 它表示 1 被视为真值 但在代码中 word Linux letter nuxi if echo word grep q le
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 如何制作 Bash 脚本来查找项目中未使用的图像?

    如何制作一个 Bash shell 脚本 它可以识别所有 jpg gif 和 png 文件 然后识别文件夹中任何文本文件中哪些文件未通过 url href 或 src 链接 这就是我开始的 但我最终得到了与我想要的相反的结果 我不想知道引用
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何在 Bash 中按自然顺序循环文件?

    我使用以下命令循环目录中的所有文件 for i in fas do some code done 不过 我按这个顺序得到它们 vvchr1 fas vvchr10 fas vvchr11 fas vvchr2 fas 代替 vvchr1 f
  • PickContact 需要 android.permission.READ_CONTACTS 或 grantUriPermission()

    首先一些信息 我首先在 Cordova 中创建了该应用程序 请参阅Cordova 权限需要 android permission READ CONTACTS 或 grantUriPermission https stackoverflow
  • Bash while 循环等待任务完成

    我创建了一个 bash 脚本来处理文件夹及其子文件夹中的视频 find type f name mkv while read file do ffmpeg i file done 问题 它不是 while 循环等待 ffmpeg 完成 而是
  • bash 脚本抱怨文件名太长

    所以我有一个脚本可以执行此操作 jq 是命令行 JSON 处理器 echo Getting LB Node IDs echo LB STATUS jq loadBalancer nodes id 最后一行的输出是 1 2 3 但是当我尝试将
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • Bash 实例未嵌套在 Dockerfile `RUN` 中

    嵌套 bash 实例会递增 SLVL 环境变量 http tldp org LDP abs html internalvariables html http tldp org LDP abs html internalvariables h
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • 测试 bash shell 脚本[重复]

    这个问题在这里已经有答案了 有人可以解释一下如何测试 bash shell 脚本吗 例如 我有一个 sh 文件 其中包含此代码 bin sh for file in txt do mv file basename file txt doc

随机推荐

  • 在 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为了构建该项目 然而 为了归档该项目 我需要定