Xcode:啥是简单语言的目标和方案?

Posted

技术标签:

【中文标题】Xcode:啥是简单语言的目标和方案?【英文标题】:Xcode: What is a target and scheme in plain language?Xcode:什么是简单语言的目标和方案? 【发布时间】:2014-01-05 09:48:46 【问题描述】:

是的,标题说明了 :-) 它们在简单的英语中是什么意思?我真的不明白苹果网站上的解释,我需要重命名我的目标,我担心在那之后没有任何效果..

【问题讨论】:

文档:developer.apple.com/library/content/featuredarticles/… 值得一读blog.just2us.com/2009/07/… 【参考方案1】:

我也在 Workspace 和 Project 中添加了!

工作区 - 包含一个或多个项目。这些项目通常相互关联 项目 - 包含代码和资源等(你会习惯这些的!) 目标 - 每个项目都有一个或多个目标。 每个目标都定义了该项目的构建设置列表 每个目标还定义了一个类、资源、自定义脚本等列表,以便在构建时包含/使用。 目标通常用于同一项目的不同分布。 例如,我的项目有两个目标,一个“普通”构建和一个“办公室”构建,它具有额外的测试功能,可能包含多个背景音乐曲目和一个用于更改曲目的按钮(就像目前一样)。 您将习惯于在添加类和资源时将它们添加到默认目标。 您可以选择将哪些类/资源添加到哪个目标。 在我的示例中,我将一个“DebugHandler”类添加到我的办公版本中 如果您添加测试,这也会添加一个新目标。 方案 - 方案定义了当您按下“构建”、“测试”、“配置文件”等时会发生什么。 通常,每个目标至少有一个方案 您可以通过转到方案 > 管理方案并按“立即自动创建方案”来为您的目标自动创建方案

【讨论】:

如果我理解正确,让我们试试……我正在编写一个应用程序并制作两个目标。一个我将上传到应用商店,另一个我已经开发了同一个应用的下一个版本。在方案中,例如,我在两个目标中都制定了一个方案来运行,一个方案用于调试?但是为什么我需要不同的方案呢?我不明白 BJ Homer 的优势.. FWIW,除非我像我在回答中描述的那样添加额外的调试功能,否则我不会使用不同的方案进行发布和调试。 你的办公楼底部有一个音乐按钮是什么意思。您的实际应用程序是否具有仅在办公版本中激活的额外代码,或者音乐是否在您的 Mac 上运行。对不起,我很困惑 这种定义了构成每个概念的事物,而不是每个项目的目的。对我来说,这就是 OP 所要求的。 @3366784 让我分享一个不同的例子。假设您是一家管理 Uber 和 Lyft(两家非常大的乘车公司)的代码库的公司。代码库有很多相似之处。两者都有乘客/司机/地图/行程等。您不想为每个代码库编写这些对象。相反,在您的项目中,您将拥有一个 Uber 目标和一个 Lyft 目标。然后对于每个目标,您可以有不同的 plist、应用程序图标等。某些类可以仅用于 Uber 目标,或仅用于 Lyft 目标。但在大多数情况下,它们将针对同一个目标。 (1/2)【参考方案2】:

target 是通过在 Xcode 中运行“构建”创建的最终产品。它可能是应用程序、框架、静态库或单元测试包。不管它是什么,它通常对应于“已构建产品”文件夹中的单个项目。

方案代表您一起工作的目标集合。它定义了当您在 Xcode 中选择各种操作(运行、测试、配置文件等)时使用哪些目标。通常,您只有一个方案,它将主应用程序目标用于运行、存档和配置文件操作,以及一个测试操作的单元测试目标。如果您正在构建两个相关的应用程序,您可能有两个使用相同单元测试包但应用程序目标不同的方案。

方案(在 Xcode 4 中引入)的主要好处是它们允许您在运行应用程序和单元测试之间切换,而无需切换所选目标。

【讨论】:

您的答案几乎正确。 Apple 描述这些的方式略有不同。请参阅下面的my answer。目标不是最终​​产品。基于 Apple '一个目标包含构建一个东西的指令,比如一个应用程序或一个框架。'。方案不一定代表目标的集合。它只是定义了如何执行某个操作。【参考方案3】:

我是一个视觉型的人,因此我将使用图表来解释这个概念。

当您有多个目标时,它们可以与 Xcode 的 Run、Test、Profile 操作一对一匹配,这个概念定义了一个 scheme

目标是您的项目的一个版本,即目标在构建时使用的类和资源略有不同。一个项目可以有多个构建时间设置,以满足不同的分发要求。

【讨论】:

这张图好像错了。一个方案应该绑定到一个特定的目标,我没有看到在一个方案中你可以有多个目标。 @Boon 不,不小心选择是正确的。在方案编辑器中,单击左侧的“构建”项。在右侧区域,单击“+”,您可以向该方案添加更多目标。根据需要勾选方框。然后,这些目标的可执行文件可在可执行文件下拉列表中的其他操作(运行、配置文件等)中使用。 这很好,但它缺少方案的构建配置部分。我认为方案是操作(运行、测试、配置文件)如何匹配目标和构建配置(调试、发布、质量保证、产品等)组合的集合。 @Boon 这个答案有点令人困惑。您极不可能使用可用于方案的运行和测试操作的目标。但是,您很可能在单个方案的相同测试操作下有多个目标。这意味着通常最好有不同的测试目标。即一个用于单元测试,另一个用于性能测试,另一个用于 UI 测试。通过这样做,您可以在单个方案的测试操作下拥有多个目标,或者让每个测试目标由一个方案的唯一测试操作运行。在下面的半答案中了解更多信息【参考方案4】:

Xcode 结构

Workspace  
  -> Project 
    -> Target 
     -> Dependency 
      -> Scheme 
        -> Action
        -> Build Configuration  
          -> Build Configuration File(.xcconfig) 

Workspace (.xcworkspace) - 是多个projects 的容器。它是作为cross-project references[About]的下一步创建的

Workspace 包含 schemes 中的所有 projects Workspace 处理所有 implicit dependencies[About]

观察:

在同一个 workspace 内处理不同项目是安全的,不要抓到
//if you try to open two projects on two Xcode instances
Couldn't load Project.xcodeproj because it is already opened from another project or workspace
Cocoapods[About]workspace 一起创建 Pods 项目

Project (.xcodeproj) - 它是targetsscheme 的容器。它定义了代码文件、资源……

还有Projects 管理Build Configuration(由scheme 更改)和Build Configuration File[About]

您可以将现有的Project 转换为Workspace

File -> Save As Workspace...

[Workspace vs Project]

Target - PBXNativeTarget 部分。定义一组特定的生成设置,生成:

Application target Library and framework targets Test Aggregate[About]。例如。它用于创建Universal frameworkUmbrella framework

Scheme

包含操作(运行、测试、配置文件、分析、存档)+ 配置(附加参数、[Build Configuration]、诊断)

方案可以共享,在 CI 中为您提供帮助,Carthage[Example]... 并位于:

<project_path>/<project_name>.xcodeproj/xcshareddata/xcschemes

Dependency - Targets 可以有 dependencies。依赖是针对源链接的。这些依赖可以静态链接也可以动态链接[About]有两种:

Explicit Dependency[About] - 位于同一个项目嵌套项目的依赖的源代码 Implicit Dependency[About] - 位于属于同一工作区的项目中的依赖项的源代码/关闭代码。

[Vocabulary]

【讨论】:

【参考方案5】:

tldr;目标包含构建模块/最终产品/应用程序的指令,例如构建 watchOS 应用和 ios 应用的说明。方案知道如何响应某些动作,例如构建操作或测试操作或存档操作。

确保您看到this moment of WWDC video — Introduction to Xcode。如果您想获得更深入的知识,请观看整个视频。该视频易于理解,但非常基础。我的答案大多是这样的。


方案

方案是您指定要运行的内容的方式,它还包含 有关如何运行它的信息。

例如,我可以有一个包含 iOS 应用和 Watch 应用的项目, 在这种情况下,我将有一个方案来运行我的 iOS 应用程序和一个 运行我的 Watch 应用的计划

Run 将在调试器中运行我的应用程序。

Test 将运行我的测试。

Profile 将在仪器中运行我的应用程序,以便我可以测量它 性能。

Analyze 将运行 Xcode 的静态分析器并帮助发现问题 否则可能会错过。

最后,存档操作将构建我的应用程序以供发布并放置 它在存档中,然后我可以用来分发给我的测试人员或 到 App Store 或保存以备将来崩溃日志去符号化,或 符号化。

项目

项目是用于组织代码的文档 Xcode 中的资源。

您对光盘上的源代码文件和资源文件有参考, 实际将这些文件构建到您的应用程序等产品中的目标, 构建设置,配置您的目标如何构建他们的产品, 以及配置您如何执行操作(例如运行)的方案 你的目标。

现在,要访问您的项目设置,请在 导航器,您选择编辑器顶部的弹出框,然后选择 你的项目在那里。

目标

您对光盘上的源代码文件和资源文件有参考, 实际将这些文件构建到您的应用程序等产品中的目标, 构建设置,配置您的目标如何构建他们的产品, 以及配置如何执行操作的方案,例如运行 [test, build],使用 你的目标。 一个目标包含构建一个东西的指令,比如一个应用程序或一个 框架。

你的目标产生的东西被称为它的产品。该组 您的目标构建其产品所采取的步骤称为构建 阶段。

最后,一个目标有构建设置来配置它如何构建它的 产品。

现在,需要注意的一件事是项目和目标都有 Build 设置和目标继承在项目级别设置的值,但 可以用特定于目标的值覆盖它们。

目标的构建阶段会做一些事情,比如构建依赖关系 首先,编译该目标中的源文件,并链接目标 针对库和框架。

总结一下:

目标

帮助将一组文件放在一起以构建/运行产品/模块/包

通常它最终只是作为您发送到应用商店的产品。 但通常它可以是一个模块,您只需针对它运行单元测试。

就像一个应用程序可以同时拥有一个 iOS 目标和一个 watchOS 目标。或者只是一个 iOS 目标。或者单个 iOS 目标以及测试目标等。

如果您转到目标的构建阶段 >> 编译源,您将看到为该目标构建的每个文件。示例:

明确引用Apple docs:

目标指定要构建的产品,并包含从项目或工作区中的一组文件构建产品的说明。一个目标定义了一个单一的产品;它将构建系统的输入(源文件和处理这些源文件的指令)组织到构建该产品所需的内容中。项目可以包含一个或多个目标,每个目标产生一个产品。

构建产品的说明采用构建设置和构建阶段的形式,您可以在 Xcode 项目编辑器中检查和编辑它们。目标继承项目构建设置,但您可以通过在目标级别指定不同的设置来覆盖任何项目设置。一次只能有一个活动目标; Xcode 方案指定活动目标。

一个目标及其创建的产品可以与另一个目标相关。如果一个目标需要另一个目标的输出才能构建,则称第一个目标依赖于第二个目标。如果两个目标都在同一个工作区中,Xcode 可以发现依赖关系,在这种情况下,它会按照所需的顺序构建产品。这种关系称为隐式依赖关系。您还可以在构建设置中指定显式目标依赖关系,并且可以指定 Xcode 可能期望具有隐式依赖关系的两个目标实际上不依赖。例如,您可以在同一工作区中构建一个库和一个链接到该库的应用程序。 Xcode 可以发现这种关系并首先自动构建库。但是,如果您确实想要链接到工作区中构建的库版本以外的库版本,则可以在构建设置中创建显式依赖项,它会覆盖此隐式依赖项。

方案

一个给定的目标可以通过不同的行动。

构建 运行 测试 个人资料 存档

您可以拥有一个启用了所有诊断的方案(这会使调试变慢)与一个没有任何诊断的方案。或者运行某些性能相关测试的方案与同时运行单元测试和性能测试的方案。您可以编辑方案,使其执行以下操作:

构建多个目标

在任何操作之前或之后执行脚本

在任何操作之前或之后发送电子邮件

运行内存管理诊断

为任何操作生成调试或发布版本。

有关更多信息,请参阅Managing Schemes


把它们放在一起:

点击运行后,Xcode 将查看选定的scheme。它将找到其关联的目标。使用该目标的 Build Phases 及其 Build Settings(将包含任何未被目标设置覆盖的 Project Settings)来将产品构建到选定的目的地(目的地可以是 iPhone 模拟器或物理 iPhone 或 watchOS 等)。

再次观看 WWDC 视频!

【讨论】:

能否请您修复视频网址?不幸的是,它现在似乎被重定向了:( @Alexa289 遗憾的是,我无法在 youtube 或 apple.com 上找到该视频。但是我从他们的演示文稿中上传了 pdf:docdro.id/kNi6PJ4 仍然值得一看【参考方案6】:

我的看法:

Target -- 较低的抽象 -- 各种构建。每个目标都有自己的构建设置(因此,如果您拆分为多个目标,请为每个目标单独处理那张巨大的表格)。目标具有包含/排除文件的便捷方式,因此您可以基于每个文件有效地配置构建。

方案 -- 一种更高的抽象 -- 通过各种部署方式(运行、测试、存档)引导目标。具有通过环境参数配置构建的适度方法,但使用来自目标的构建设置。创建/编辑/删除方案比目标更便宜、更容易。

您可以有多个方案以几种不同的方式引导一个目标。

【讨论】:

以上是关于Xcode:啥是简单语言的目标和方案?的主要内容,如果未能解决你的问题,请参考以下文章

简述啥是源语言,目标语言,中间语言

啥是OKR

啥是OKR

在 XCode 中更改项目和目标名称

带有主机应用程序的 Xcode 测试目标强制错误的目标进入方案的构建部分

Xcode 5:一个方案中的多个测试目标:“模拟器已在使用”