Как использовать диспетчер пакетов Swift с существующим проектом macOS?

Я использую Cocoapods для управления зависимостями для моего проекта Swift. Я наткнулся на этот пакет, который не указан в Cocoapods. Вместо этого предлагается использовать Swift Package Manager. Тем не менее, всякий раз, когда я пытаюсь использовать диспетчер пакетов Swift, чтобы сделать что-то в принципе, он полностью разрушает весь мой проект.

Итак, чтобы выяснить, как использовать Swift Package Manager, я играю с ним в тестовом проекте.

Вот что я пробовал:

  1. Создайте новый проект из Xcode

Файл → Создать → Проект → Приложение Cocoa

Наименование продукта: basic-ssh-test

Это создает базовое приложение, которое загружает пустое окно, когда я нажимаю "Выполнить". Просто для удовольствия я добавил print("test") к функции applicationDidFinishLaunching в своем AppDelegate поэтому окно отладки говорит "тест", когда я запускаю программу.

Теперь я хочу добавить пакет 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 каталог .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 с единственным быстрым файлом в нем main.swift с print("Hello, world!").

Код, который мне действительно интересен, теперь находится в синей папке с именем basic-ssh-test. Все необходимые файлы все еще там, но вместо запуска моего приложения Xcode запускает файл main.swift. Я могу сказать, потому что вывод отладки - "Привет, мир!". вместо "теста".

Я прочитал несколько руководств, в которых утверждается, что Swift Package Manager переместит мои исходные файлы и продолжит строить то же самое, что и раньше, но это явно не так.

В моих настройках сборки больше нет опции "Основной интерфейс", поэтому я не могу выбрать "MainMenu.xib" в качестве начальной точки приложения.

Это по сути то же самое, что происходит, когда я пытаюсь использовать Swift Project Manager с моим существующим проектом. Он тянет зависимости, но в основном игнорирует весь мой существующий проект и просто запускает код "hello world".

Как использовать диспетчер пакетов Swift для добавления зависимости к существующему проекту без игнорирования существующей кодовой базы?

Ответы

Ответ 1

Я думаю, что SPM совместим только с исполняемыми файлами или библиотеками командной строки Mac. Это явно указывает, что SPM не поддерживает платформы iOS, watchOS или tvOS. Но поскольку цели приложения macOS AppKit/Cocoa очень похожи на целевые объекты iOS или tvOS Xcode, я бы сказал, что это утверждение подразумевает, что SPM нельзя использовать с приложениями MacOS Cocoa из коробки, и это то, что я думаю, что вы надеясь на.

Похоже, здесь есть какая-то работа, как использовать его с целевыми приложениями iOS, которые должны в значительной степени переходить на цель macOS Cocoa.

Ответ 2

До момента написания ответа диспетчер пакетов Swift не поддерживает iOS, tvOS и watchOS. Вместо этого вам придется добавлять файлы из пакета непосредственно в свой проект.

Я предлагаю вам создать группу Dependencies в вашем проекте и группу, расположенную ниже, с именем пакета, как этот ответ:

Итак, сначала вы добавите зависимость файлов, которые хотите импортировать в свой проект, к имени имени пакета, которое включено в группу Dependencies, которую мы делаем ранее.

После того, как вы добавите файлы, вы можете получить доступ к коду, как обычно, когда пишете его самостоятельно, как показано ниже. Импорт не требуется. Вы можете посмотреть более подробную информацию в здесь. Надеюсь, поможет.

enter image description here

Ответ 3

Вы можете создать оконное приложение, используя SPM (у меня есть весь проект, ожидающий ABI, который это делает) вам просто нужна плита котла в swift.main. Я выкапываю.

Однако метод, о котором говорят другие, никогда не будет работать (с текущими версиями SPM).

Однако то, что я вижу, заключается в том, что вы действительно хотите использовать SPM для управления зависимостями (сохраняя актуальность и т.д.). Поэтому я думаю, что вы могли бы сделать это гораздо легче.

Вместо того, чтобы создавать исполняемый файл в качестве целевой по умолчанию, вместо этого создайте библиотеку (возможно, называйте ее базовыми-ssh-зависимостями). Создайте проект Xcode и перетащите THAT в свой основной проект Xcode и настройте свою цель, чтобы зависеть от нее. Когда вы обновляете библиотеку из SPM для изменений зависимостей, вы должны переименовать свой Xcode-proj.

Сообщите мне свой пробег и любые морщины, или если я неправильно понял, чего вы пытаетесь достичь.