Xcode如何找到隐式目标依赖项?

nac*_*o4d 16 macos xcode ios

Xcode有时会自动找到依赖项.当我是那个定义关系的人,当我变得懒惰时,我认为是可以的......

但更多的时候我发现自己面临着一个存在(中等到大尺寸)项目的目标.由于该项目是由其他人制作的,我发现很难理解哪些目标取决于什么,因为并非所有关系都是明确的.

Xcode用于查找此类关系的规则是什么?(我希望我能理解逻辑,所以在我的脑海中运行它并且可能在将来节省一些时间)或者是什么使目标有资格隐含地依赖于另一个?

目标及其创建的产品可能与另一个目标相关.如果目标需要另一个目标的输出以便构建,则说第一个目标依赖于第二个目标.如果两个目标都位于同一工作空间中,Xcode可以发现依赖关系,在这种情况下,它会按所需顺序构建产品.这种关系被称为隐式依赖.

来源:iOS开发者库→Xcode概念→Xcode目标

dma*_*ach 10

这个答案适用于Xcode 8.x,我想Xcode 9.0.

首先,您需要确保在您尝试构建的Scheme的Build面板中启用了"Find Implicit Dependencies".

目标"A"可以通过两种方式"隐式地"依赖于目标"B":

  1. 目标A具有"链接二进制与库"构建阶段,其列表中的库与B的产品具有相同的名称.此产品可以位于同一项目中,也可以位于工作区中的另一个项目中.请注意,我说"同名".仅仅因为您从目标A中选择了libA.a并不意味着如果您在另一个目标中有另一个libA.a产品,则隐式依赖项将构建它.请参阅下文了解详情.
  2. 目标A有一个"复制文件阶段",它复制一个基本名称与B的产品相匹配的文件.通常,"复制文件"构建阶段不能引用与其目标不在同一项目中的文件,但是您可以设置跨项目的依赖,如果你创建一个虚拟文件"复制文件"阶段复制具有相同的名称作为B的产品.例如,如果你有一个包含两个项目项目A和项目B工作空间.ProjectA具有创建libA.a的TargetA,而ProjectB具有创建libB.a的TargetB.TargetA可以通过将一个"伪"零字节文件作为TargetA的一部分来构建libB.a来构建libB.a,这个文件碰巧被命名为libB.a,这就足以得到libB.a,即使libB.a引用了在"复制文件"阶段,与TargetB构建的产品输出完全不同.如果选中"仅在安装时复制"框,Xcode将不会实际执行复制,但仍将解决依赖关系.您实际上可以删除您创建的驱动器中的伪文件,只是为了将某些内容放入"复制文件"阶段(但您必须将其保留在项目中).

那么为什么有人想要做出"2"的恐怖?我可以提出几个原因.

  1. TargetA需要一些由TargetB复制/生成的文件,但TargetB不生成要链接的库.你可以通过让TargetB生成一个小的虚拟库来解决这个问题,但由于其他原因,这可能会很痛苦.
  2. 假设我有projectA,targetA和libA.a(以及项目B,C和D的等价物),libA.a依赖于libB.a和libC.a,它们都需要首先构建libD.a(可能是一些头文件)和/或生成的来源).您可以使用"Link With Libraries"阶段(也称为解决方案#1)完成所有操作,但在这种情况下,您最终会在libA的最终链接版本中以libD中的两个.o文件副本结束.如果你这样做你很快就会有巨大的库文件在他们几个相同的.o文件结束了,你的链接速度,将成为可怕的这足够深(即有对彼此依赖的不同级别40个项目如工作区).

如果您认为这些都是人为的情况,那么我目前正在试图将一些遗留代码从一系列显式依赖项迁移到隐式依赖项.为什么我要转向隐式依赖?因为Xcode中的显式依赖需要项目嵌套,并且一旦获得足够的显式依赖项,项目浏览器就会变得非常慢,并且您会在Xcode中看到很多随意的内容.

如果您碰巧在同一工作区内有两个目标,生成具有相同名称的产品并依赖于第三个目标,会发生什么?隐式依赖将选择一个.这似乎是做基于产品的基本名称(所以富/ bar.a的和巴兹/ bar.a的是相同的)比赛,并会选择它找到的第一个.


yoA*_*ex5 6

Xcode 隐式依赖

\n

Xcode Dependency[About]是构建所需的依赖项选定目标

\n

Implicit依赖性

\n
    \n
  • 源代码又名Non-compiled dependencies. Xcode 允许添加整个workspace. 一个很好的例子是来自 GitHub 的项目或CocoaPods[关于]带有源代码的
  • \n
  • 封闭代码又名Precompiled dependencies-External外部二进制文件CocoaPods,,Carthage封闭代码
  • \n
\n

Implicit dependency是成功构建目标所必需的依赖项,但未明确定义\xe2\x80\x99。

\n
    \n
  1. General在->Framework, Libraries, and Embedded Content或 `嵌入式二进制文件以及链接框架和库[链接与嵌入]中指定
  2. \n
  3. 没有依赖性Build Phases -> Dependencies || Target Dependencies
  4. \n
\n\n

要打开此功能[无此模块]

\n
Edit Scheme -> Build -> Find Implicit Dependencies\n
Run Code Online (Sandbox Code Playgroud)\n\n

[显式依赖]

\n

[词汇]

\n