【问题标题】:Xcode: External build configuration for framework targetXcode:框架目标的外部构建配置
【发布时间】:2021-12-30 01:11:25
【问题描述】:

我们有一个Filters 框架,其中包含许多图像处理过滤器(用 Swift 和 Metal 编写)和它们所需的资源(例如 ML 模型和静态图像)。但并非我们拥有的每个应用程序都使用Filters 中的所有过滤器。相反,我们只想构建和捆绑应用所需的过滤器和资源。

我们能想到的唯一方法是在 Xcode 中创建不同的框架目标,为每个应用创建一个目标。但这需要Filters 框架项目“了解”它的所有消费者(应用程序),我们宁愿避免这种情况。特别是因为过滤器位于单独的存储库中。

有没有办法,例如,将某种配置文件传递给在构建时用于决定构建和捆绑哪些文件的框架?

【问题讨论】:

    标签: ios swift xcode macos build


    【解决方案1】:

    您可以使用 Target Membership 将文件分配给特定目标。见下图。

    确保您位于 Xcode 右侧的 File Inspector 选项卡上。选择要限制到目标的文件,在Target Membership 区域中,您可以选择所选文件属于或不属于哪个目标。对于公共资源,请务必选择 public 作为可见范围。

    对于不需要编译的文件,例如图片文件,一旦您选择了目标成员,该文件将自动添加到Build Phases'Copy Bundle Resources区域。

    另一种选择

    或者,您可以使用在Build Phases 中添加Copy Files Phase。使用Copy Files Phase,您可以将文件复制到子目录而不是框架包的根目录。

    备选方案二

    另一种方法是在Build Phases 中添加Run Script Phase。该脚本可以是任何语言,但通常是 shell 脚本。您可以在脚本中执行您需要的任何操作,包括手动编译代码,但您需要通过使用环境变量了解文件的位置并将文件放置在正确的位置。我认为这将是用于根据目标选择文件的最手动和最麻烦的方法。

    替代三

    如果您真的想花哨,您甚至可以将所有组件分解为目标并使用Aggregate target 将不同的组件绑定到您正在构建的目标中。我通常不建议这样做,并将其保留用于其他方法无法实现的非常特殊的需求。

    【讨论】:

    • 感谢您的回复!我希望我可以避免向Filters 项目引入新目标。相反,我希望有一种方法可以从框架编译期间使用的框架用户向下传递某种构建配置文件。
    • 这意味着您不独立于应用程序项目编译过滤器框架?这意味着过滤器框架项目嵌入到您的应用程序项目中并在每次构建应用程序时自动构建?如果您使用 git 作为源代码控制,我认为您将 Filters 框架作为应用程序存储库的子模块?
    • 完全正确。但如果过滤器项目不需要了解正在使用它的应用程序,我会更喜欢。我现在的解决方案是为过滤器项目中的每个应用程序设置一个额外的特定于应用程序的过滤器目标。这行得通,但如果有意义的话,我会更喜欢configure + make 这样的东西。
    • 在这种情况下,您可能需要检查外部构建系统。使用外部构建系统可以指定任何构建系统,包括make。唯一的问题是您的Filters 框架是一个Xcode 项目。要使用外部构建系统来构建您的框架,您需要在外部构建系统上复制所有 Xcode 构建步骤。
    • PS:需要将外部构建系统添加到应用程序项目而不是框架项目中,以使框架不知道不同的应用程序。此外,应用程序项目需要通过从 Xcode 项目中排除子模块来关闭构建框架,并且只存在于 git 级别。
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多