【问题标题】:How do I use Swift Package Manager with an existing macOS project?如何在现有的 macOS 项目中使用 Swift 包管理器?
【发布时间】:2018-07-27 23:43:10
【问题描述】:

我一直在使用 Cocoapods 来管理我的 Swift 项目的依赖项。我遇到了this package,它没有在 Cocoapods 中列出。相反,它建议使用 Swift 包管理器。然而,每当我尝试使用 Swift 包管理器做任何事情时,它最终都会彻底破坏我的整个项目。

所以,为了弄清楚如何实际使用 Swift 包管理器,我正在一个测试项目中使用它。

这是我尝试过的:

  1. 从 Xcode 创建一个新项目

文件 -> 新建 -> 项目 -> Cocoa 应用程序

产品名称:basic-ssh-test

这会创建一个基本应用程序,当我点击“运行”时它会加载一个空白窗口。只是为了好玩,我在AppDelegateapplicationDidFinishLaunching 函数中添加了print("test"),所以当我运行程序时调试窗口会显示“测试”。

现在我想添加 Shout 包作为依赖项。

  1. swift package init --type executable

这将创建以下文件:

Creating executable package: basic-ssh-test
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/basic-ssh-test/main.swift
Creating Tests/

现在我要将“Shout”依赖项添加到我的新Package.swift 文件中:

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "basic-ssh-test",
    dependencies: [
        .package(url: "https://github.com/jakeheis/Shout", from: "0.2.0")
    ],
    targets: [
        .target(
            name: "basic-ssh-test",
            dependencies: ["Shout"]),
    ]
)

我将引入依赖项:

  1. swift package resolve

这会导致依赖项被拉入.build 目录:

Fetching https://github.com/jakeheis/Shout
Fetching https://github.com/jakeheis/CSSH
Fetching https://github.com/IBM-Swift/BlueSocket
Cloning https://github.com/IBM-Swift/BlueSocket
Resolving https://github.com/IBM-Swift/BlueSocket at 0.12.91
Cloning https://github.com/jakeheis/CSSH
Resolving https://github.com/jakeheis/CSSH at 1.0.3
Cloning https://github.com/jakeheis/Shout
Resolving https://github.com/jakeheis/Shout at 0.3.0

现在我重新生成xcodeproj 文件:

  1. swift package generate-xcodeproj

现在,当我打开 xcodeproj 文件时,有一个名为 Sources 的新组有一个目录 basic-ssh-test,其中有一个 swift 文件 main.swiftprint("Hello, world!")

我真正感兴趣的代码现在位于名为basic-ssh-test 的蓝色文件夹中。所有必要的文件仍然在那里,但 Xcode 没有运行我的应用程序,而是运行main.swift 文件。我可以说是因为调试输出是“Hello, world!”而不是“测试”。

我已经阅读了一些教程,声称 Swift 包管理器将移动我的源文件并继续像以前一样构建,但显然不是这样。

我的构建设置中也不再有“主界面”选项,因此我无法选择“MainMenu.xib”作为我的应用程序起点。

这与我尝试在现有项目中使用 Swift 项目管理器时发生的情况基本相同。它引入了依赖项,但它基本上忽略了我的整个现有项目,只运行“hello world”代码。

如何使用 Swift 包管理器在不忽略现有代码库的情况下向现有项目添加依赖项?

【问题讨论】:

  • 你需要创建一个新的“构建目标”并配置好
  • 谢谢@MatthewLuiHK。我创建了一个新的构建目标,但它具有与现有构建目标相同的选项,即构建设置中没有“主界面”选项。如何设置主界面?
  • 你的目标应该是“应用”类型

标签: swift xcode macos


【解决方案1】:

我认为 SPM 仅与 Mac 命令行可执行文件或库兼容。 This 明确声明 SPM 根本不支持 iOS、watchOS 或 tvOS 平台。但是,由于 macOS AppKit/Cocoa 应用程序目标与 iOS 或 tvOS Xcode 目标非常相似,我会说这个陈述意味着 SPM 也不能与 macOS Cocoa 应用程序一起使用,这就是我认为你是希望。

似乎有some work here 介绍了如何将它与 iOS 应用程序目标一起使用,这在很大程度上应转换为 macOS Cocoa 目标。

【讨论】:

  • 该链接还说 UIKit 和 AppKit “如果它们存在于正确的系统位置,它们应该可以工作”。如果 iOS 不支持,我不确定他们希望 UIKit 如何工作。这听起来更像是“你必须自己弄清楚”,而不是“它根本行不通”。
  • @Ssswift 我认为他们指的是导入 UIKit 以作为依赖项对其进行编译。
【解决方案2】:

在撰写本文之前,Swift Package Manager 不支持 iOS、tvOS 和 watchOS。相反,您必须将包中的文件直接添加到您的项目中。

我建议您在项目中创建一个 Dependencies 组,并在该组下面创建一个具有包名称的组,例如 this answer:

因此,首先您将要导入项目的文件依赖项添加到我们之前创建的 Dependencies 组中包含的包名称的名称中。

添加文件后,您可以像通常自己编写代码时一样访问代码,如下图所示。不需要进口。您可以在here 中查看更多详细信息。希望有帮助。

【讨论】:

    【解决方案3】:

    您可以使用 SPM 创建一个窗口应用程序(我有一个等待执行此操作的 ABI 的整个项目)您只需要 swift.main 中的一些样板。我会挖出来的。

    但是其他人建议的方法永远不会起作用(使用当前版本的 SPM)。

    但是,我看到的是您确实想使用 SPM 来管理依赖项(保持最新等)。所以我认为你可以更容易地做到这一点。

    与其创建一个可执行文件作为您的默认目标,不如创建一个库(也许称之为 basic-ssh-dependencies)。生成您的 Xcode 项目并将其拖到您的主 Xcode 项目中,并将您的目标配置为依赖它。当您从 SPM 更新库以更改依赖项时,您应该重新生成 Xcode-proj。

    如果我误解了您想要达到的目标,请告诉我您的里程和任何皱纹。

    【讨论】:

      【解决方案4】:

      XCode 11 更新

      现在有了 XCode 11,这很多变得容易了。在撰写本文时,XCode 的当前版本是 11.3.1。

      对于现有的 XCode 项目,只需:

      1. 转至File->Swift Packages->Add Package Dependency...
      2. 输入您要添加的托管包的 URL
      3. 选择有关您的应用将使用哪些版本的规则
      4. 点击Finish

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多