【问题标题】:Xcode workspaces with sub-projects and project dependencies triggering builds带有子项目和项目依赖项的 Xcode 工作区触发构建
【发布时间】:2013-10-14 08:46:16
【问题描述】:

我希望 Xcode 5 有更好的文档,但我找不到任何合适的描述使用工作区的最佳实践,所以..

在具有多个项目(几个框架,1 个应用程序)的工作区中,是否可以让 Xcode仅在需要时构建所有依赖项目(即发现更改)无需包含所有依赖项目中的所有项目

我宁愿只让项目中的框架依赖于它,而不是在其中包含 5-6 个子项目,因为这只是 导航视图中的一团糟 -
子项目中的文件一直显示在搜索结果中,NavView 中的子项目会因任何原因在项目中展开..

但是,如果不包含特定项目所依赖的项目,如果其中一个依赖项发生了变化,我无法找到让 Xcode 5 自动重新构建框架的方法

【问题讨论】:

    标签: xcode cocoa frameworks xcode5


    【解决方案1】:

    您可以创建一个构建所有目标的方案。

    【讨论】:

    • 嗯.. 是的 - 但那将是蛮力方法。我宁愿让 Xcode 智能地只构建所需的依赖项。
    • @Jay 在我从事的大型项目中,有时我希望编译我的主二进制文件(使用已构建的依赖项),而其他时候我想构建整个依赖项链。对我们的项目进行完整构建可能需要数小时,当我对框架进行重大更改时我愿意这样做,但当我在我的主二进制文件中进行更改时我不愿意这样做。当您拥有所有源代码时,就会发生这种情况。使用自定义方案,我可以在特定目标上进行干净的构建,为特定目标运行测试,并真正完全控制 Xcode IDE。我会说这种设置有点少见。
    • 这确实有效,但很糟糕,因为要将其构建为依赖项,您需要关闭并行构建,这会通过使构建非常缓慢而毁掉每个人的生活。
    【解决方案2】:

    在 Xcode 5 中,您必须:

    • 在左侧选项卡中选择项目
    • 在 TARGETS 部分中选择目标
    • 然后在 Build Phases > Target Dependencies 按“+”
    • 选择添加的项目作为目标,它将出现在 Target Dependencies 列表中

    如果可行,则在构建所有目标依赖项时,如果需要,将一起构建。

    【讨论】:

    • 对我不起作用 - 如果当前项目所依赖的其他项目不能添加到 Build Phases 中,无论是通过 + 还是通过从工作空间中的其他项目拖放。
    • 先尝试将第二个项目拖放到第一个项目。然后转到构建阶段 > 目标依赖项。在此处按下“+”时,您应该会看到要选择的第二个项目。
    • 我在一个工作空间中有一个框架和另一个项目,这解决了工作空间克隆不建立依赖关系的问题。谢谢
    【解决方案3】:

    此解决方案旨在解决另一个问题,但它可能满足您的需求。

    将子项目添加到工作区后:

    1. 选择应该使用新添加的子项目的目标
    2. 在 Build Phases 下的“Link Binaries with Libraries”中点击 + 按钮
    3. 如果库未显示,请点击“添加其他...”
    4. 导航到项目文件 (*.xcodeproj) 所在的文件夹
    5. 标记并点击“打开”
    6. 现在您应该看到项目文件显示在“链接二进制文件”下 与库"
    7. 在同一选项卡的“目标依赖项”下,点击 + 按钮
    8. 现在您应该会看到必要的文件
    9. 检查您的并点击“添加”
    10. 再次在“将二进制文件与库链接”中点击 + 按钮
    11. 现在您的 .a 文件应该会显示出来,您可以选择并添加它

    现在您正在为您的目标使用选择的库。对需要此子项目的每个目标重复这些步骤。希望有帮助!对我来说它确实是因为我之前无法设法向它添加依赖项......

    问候,汤姆特

    【讨论】:

    • 如果隐式依赖被关闭,这将不起作用,这会大大减慢索引和构建大型工作区的速度。
    • 如果您在使用 XCode 7 时遇到问题,请参阅 Raspu's Answer
    • 请注意,这是一种将项目引用添加到项目的复杂方式。完成上述所有步骤后,尝试从“Link Binaries with Libraries”中删除该项目,并观察“Target Dependency”部分下仍然有对该项目的引用。这是因为当项目被引入“Link Binaries with Libraries”时,对子项目的引用被添加到项目中。您可以在“Frameworks”目录下找到此参考资料。
    • 不幸的是,这不起作用(至少在 Xcode 8 或 9 上不起作用)。我仍然得到No such module 'TheModuleNameHere',我使用import TheModuleNameHere 导入。
    【解决方案4】:

    考虑迁移到CocoaPods

    它不仅可以解决您的构建问题,而且对于您描述的如此复杂的项目,它可以在更新/添加/删除框架、更改目标系统版本以及解决依赖关系和冲突时让您的生活变得轻松。

    您的工作区也可能只有两个项目。

    【讨论】:

    • 嗯 - 有趣。虽然当我们希望一次加载所有项目时,我看不出依赖管理如何解决 Xcode 中的问题。
    • 可能你当前工作空间中的依赖和依赖的依赖太复杂了,以至于 Xcode 无法正确决定再次构建什么。
    • 只是很好的旧应用程序层,真的 - 基础类、模块、应用程序构建在彼此之上。没有周期,没有什么花哨的。只是一堆项目,取决于系统底层的项目。
    • 不全是乐趣和游戏;你会发现自己经常运行pod install,如果每次都需要一分钟左右,这真的会让你慢下来。
    • @fatuhoku 您可以随时将PodsCarthage 项目添加到您的git 而不是忽略它。它有很多好处(例如,如果有人删除了你仍然拥有的 repo,你处于该项目的版本控制之下,git blame 非常快,在提交之间切换非常快等)。
    【解决方案5】:

    以防万一其他人在 Xcode 7 中遇到此问题:在添加或删除它之前,请确保您要添加为子项目的项目打开。

    【讨论】:

    • 谢谢。我发现我还必须关闭另一个使用子项目的项目才能添加它。 (即“确保要添加为子项目的项目未打开,即使作为另一个项目中的子项目,在添加或删除它之前”)
    • 谢谢谢谢你把我的头发扯了一个小时。
    【解决方案6】:

    这来自于 Tomte 的回答。他的方法导致我出现依赖分析错误。这是一种更直接的方法,并解释了为什么 Tomte 的答案有效:

    1. 点击子项目,将其拖入需要定位子项目的项目中。
    2. 现在应该显示选项警报。确保未选择如果需要则复制项目。确保选择了创建组。确保没有选择项目的任何目标。按完成按钮。
    3. 单击刚刚添加子项目引用的项目。
    4. 单击要对子项目具有依赖关系的目标。
    5. 单击Target Dependecies + 按钮。
    6. 请注意,子项目的产品被列为一个选项。选择它。

    请注意,当使用 Tomte 的方法时,将项目添加到 Link Binary With Libraries 时,会创建一个项目引用。此项目参考可在项目的框架组中找到。

    我对这是否是一个好方法感到矛盾。在我看来,方案方法也好不到哪里去。我实际上想知道为什么工作区项目默认情况下没有这种关系。

    至少,这应该可以清除 Tomte 解决方案中的魔力。

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2013-01-30
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2015-11-30
      • 2014-03-19
      • 2012-12-30
      • 2016-11-27
      相关资源
      最近更新 更多