【问题标题】:Consume Swift Package for multiple targets and platforms in a project?为项目中的多个目标和平台使用 Swift 包?
【发布时间】:2019-12-28 18:12:43
【问题描述】:

我有一个包含多个目标的项目,例如一个 iOS 应用、一个 watchOS 应用和一些框架。如何将相同的 Swift 包分配给我的所有目标? Xcode 只让我选择一个:

如果我尝试再次添加 Swift 包以便尝试将其分配给项目中的另一个目标,则会收到错误消息:

这样做的正确方法是什么?下面是 Swift 包中的包清单。在那方面有什么事情要做,或者我必须在 Xcode 中做一些不同的事情吗?

import PackageDescription

let package = Package(
    name: "Alamofire",
    platforms: [
        .macOS(.v10_12),
        .iOS(.v10),
        .tvOS(.v10),
        .watchOS(.v3)
    ],
    products: [
        .library(
            name: "Alamofire",
            targets: ["Alamofire"])
    ],
    targets: [
        .target(
            name: "Alamofire",
            path: "Source")
    ],
    swiftLanguageVersions: [.v5]
)

【问题讨论】:

  • 我目前的解决方法是将通用 Swift Package 依赖项生成的 Xcode 项目拖放添加为 iOS 和 macOS 顶级项目的子项目。 (...仍在 Xcode 10 上)...在 Vapor server and companion iOS app examples 上讨论一些方法。
  • 这是苹果公司的一个巨大疏忽。两年后,Swift Package Manager 仍然是 Xcode 的 default 项目类型 - Multiplatform App 中的非入门者。

标签: swift xcode11 swift-package-manager


【解决方案1】:

我遇到了同样的问题,我只找到了这两个解决方案:

首先,将包添加到第一个目标:

然后,第一个选项是转到另一个目标,常规选项卡,在框架、库和嵌入式内容中按 +,选择包并按添加:

另一个选项是构建阶段并在 Link Binary With Libraries 中重复类似的方式:

目前,我只知道这个选项,我希望将来苹果可以通过多重检查来改进这一点。

【讨论】:

  • 经过数小时的挫折之后,您才救了我。谢谢!
  • 我收到一个错误:“Swift package product _ 被链接为静态库...这将导致库代码重复”。据我所知,唯一的区别是我的目标之一是扩展。
  • 经过测试,按描述工作。感谢您的帮助。
  • 这将在多个目标中复制所有符号。不好。
  • 我很确定第一个选项(常规选项卡)是您应该如何执行此操作 - 在配置方面生成的内容与您执行初始目标时生成的内容相同SPM 设置工具
【解决方案2】:

除了diego-carrera 提供的解决方案之外,我还必须重置 swift 包缓存以使该包可用于框架对话框中的所有目标。

在 Xcode 中:文件 -> Swift 包 -> 重置包缓存

【讨论】:

    【解决方案3】:

    如果在添加依赖项后添加新目标,则必须从项目中删除依赖项,然后重新添加。否则该库将不会显示在框架选择器中。

    Xcode 可以用 Swift 包管理器做的一件可靠的事情就是让我崩溃,这很烦人。所以请确保你有一个项目的备份,因为它可能会进入一个刚刚打开它就会导致 Xcode 崩溃的状态。

    【讨论】:

      【解决方案4】:

      我在尝试将新的 Numerics 包添加到我的项目时遇到了同样的问题,该包包含一个名为 CreativeCoding 的 iOS 目标和一个名为 ma​​ndelbrot 的 Mac 命令行目标。

      我在 Xcode 中以正常方式将包添加到第一个目标。然后我退出 Xcode 并在编辑器中打开 project.pbxproj 文件(当然是 vi)。 然后我进入 / Begin PBXNativeTarget 部分 / 评论,找到我的 CreativeCoding 目标并从 packageProductDependencies 包含新 Numerics 包(Numerics、ComplexModule、RealModule)的容器,并将它们粘贴到我的 ma​​ndelbrot 命令行目标的 packageProductDependencies 容器中。

      /* Begin PBXNativeTarget section */
                  8B083F4B24F0B40000A225C8 /* CreativeCoding */ = {
                          isa = PBXNativeTarget;
                          buildConfigurationList = 8B083F6024F0B40200A225C8 /* Build configuration list for PBXNativeTarget "CreativeCoding" */;
                          buildPhases = (
                                  8B083F4824F0B40000A225C8 /* Sources */,
                                  8B083F4924F0B40000A225C8 /* Frameworks */,
                                  8B083F4A24F0B40000A225C8 /* Resources */,
                          );
                          buildRules = (
                          );
                          dependencies = (
                          );
                          name = CreativeCoding;
                          packageProductDependencies = (
                                  8B22BD29263E328B00867530 /* ComplexModule */,
                                  8B22BD2B263E328B00867530 /* RealModule */,
                                  8B22BD2D263E328B00867530 /* Numerics */,
                          );
                          productName = CreativeCoding;
                          productReference = 8B083F4C24F0B40000A225C8 /* CreativeCoding.app */;
                          productType = "com.apple.product-type.application";
                  };
                  8BE83F4F26213D1C00663AC9 /* mandelbrot */ = {
                          isa = PBXNativeTarget;
                          buildConfigurationList = 8BE83F5626213D1D00663AC9 /* Build configuration list for PBXNativeTarget "mandelbrot" */;
                          buildPhases = (
                                  8BE83F4C26213D1C00663AC9 /* Sources */,
                                  8BE83F4D26213D1C00663AC9 /* Frameworks */,
                                  8BE83F4E26213D1C00663AC9 /* CopyFiles */,
                          );
                          buildRules = (
                          );
                          dependencies = (
                          );
                          name = mandelbrot;
                          packageProductDependencies = (
                                  8BB120942622CCB8008EDAB0 /* ArgumentParser */,
                                  8B22BD29263E328B00867530 /* ComplexModule */,
                                  8B22BD2B263E328B00867530 /* RealModule */,
                                  8B22BD2D263E328B00867530 /* Numerics */,
                          );
                          productName = mandlebrot;
      

      这对我来说可能更容易一些,因为我已经在我的第二个目标上拥有了 ArgumentParser 包,我刚刚将 3 个新行附加到。但是,您可以执行相同的操作并将临时包添加到您的第二个目标。

      然后我进入 Xcode 并像往常一样构建了两个目标,并且成功了。

      【讨论】:

        【解决方案5】:

        使用 Xcode 12,您只需选择第二个目标并添加依赖项(swift 包)。

        【讨论】:

          猜你喜欢
          • 2015-09-19
          • 1970-01-01
          • 2015-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          相关资源
          最近更新 更多