如何将Swift Package Manager与现有的macOS项目一起使用?

时间:2018-02-17 02:42:58

标签: swift xcode macos

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

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

以下是我尝试的内容:

  1. 从Xcode创建一个新项目
  2.   

    档案 - >新 - >项目 - >可可应用程序

         

    产品名称:basic-ssh-test

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

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

    1. swift package init --type executable
    2. 这将创建以下文件:

      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
      2. 这导致依赖关系被拉入.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
        2. 现在当我打开xcodeproj文件时,有一个名为Sources的新组,其中包含一个目录basic-ssh-test,其中包含一个swift文件main.swift print("Hello, world!") basic-ssh-test 1}}。

          我实际感兴趣的代码现在位于名为main.swift的蓝色文件夹中。所有必需的文件仍在那里,但Xcode运行<%= link_to @partner.media.url, "Download" %> 文件而不是运行我的应用程序。我可以说,因为调试输出是&#34; Hello,world!&#34;而不是&#34;测试&#34;。

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

          还有一个&#34;主界面&#34;我的构建设置中的选项,因此我无法选择&#34; MainMenu.xib&#34;作为我的申请起点。

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

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

4 个答案:

答案 0 :(得分:8)

我认为SPM仅与Mac命令行可执行文件或库兼容。 This明确声明SPM根本不支持iOS,watchOS或tvOS平台。但是,由于macOS AppKit / Cocoa应用程序目标与iOS或tvOS Xcode目标非常相似,我想这句话暗示SPM不能与开箱即用的macOS Cocoa应用程序一起使用,这就是我认为你的希望。

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

答案 1 :(得分:3)

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

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

但是,我看到的是你真的想使用SPM来管理依赖关系(保持最新等)。所以我认为你可以更轻松地做到这一点。

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

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

答案 2 :(得分:3)

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

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

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

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

enter image description here

答案 3 :(得分:2)

XCode 11更新

现在,使用XCode 11可以更轻松地很多。截至撰写本文时,XCode的当前版本为11.3.1。

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

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

File, Swift Packages, Add Package Dependency...

Add URL

Package rules

Package has been added