首页 文章

如何在现有macOS项目中使用Swift Package Manager?

提问于
浏览
26

我一直在使用Cocoapods来管理我的Swift项目的依赖项 . 我遇到了this package,未列入Cocoapods . 相反,它建议使用Swift Package Manager . 但是,每当我尝试使用Swift Package Manager基本上做任何事情时,它最终会完全破坏我的整个项目 .

因此,为了弄清楚如何实际使用Swift Package Manager,我正在测试项目中使用它 .

这是我尝试过的:

  • 从Xcode创建一个新项目

文件 - >新建 - >项目 - > Cocoa App产品名称:basic-ssh-test

这会创建一个基本应用程序,当我按下"Run"时会加载一个空白窗口 . 为了好玩,我将 print("test") 添加到 AppDelegate 中的 applicationDidFinishLaunching 函数中,因此当我运行程序时,调试窗口会显示"test" .

现在我想将 Shout 包添加为依赖项 .

  • 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"]),
    ]
)

我会介入依赖项:

  • 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 文件:

  • swift package generate-xcodeproj

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

我实际感兴趣的代码现在位于一个名为 basic-ssh-test 的蓝色文件夹中 . 所有必要的文件仍在那里,但Xcode不运行我的应用程序,而是运行 main.swift 文件 . 我可以告诉,因为调试输出是"Hello, world!"而不是"test" .

我已经阅读了几个教程,声称Swift Package Manager将移动我的源文件并继续像以前一样构建,但事实并非如此 .

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

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

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

3 回答

  • 3

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

    然而,其他人建议的方法永远不会起作用(使用当前版本的SPM) .

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

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

    让我知道你的里程和任何皱纹,或者我是否误解了你想要实现的目标 .

  • 3

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

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

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

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

    enter image description here

  • 8

    我认为SPM只与Mac命令行可执行文件或库兼容 . This明确声明SPM不能与开箱即用的macOS Cocoa应用程序一起使用,这是我认为你希望的 .

    看起来有some work here关于如何将它与iOS应用程序目标一起使用,这应该主要转换为macOS Cocoa目标 .

相关问题