Как использовать диспетчер пакетов Swift с существующим проектом macOS?
Я использую Cocoapods для управления зависимостями для моего проекта Swift. Я наткнулся на этот пакет, который не указан в Cocoapods. Вместо этого предлагается использовать Swift Package Manager. Тем не менее, всякий раз, когда я пытаюсь использовать диспетчер пакетов Swift, чтобы сделать что-то в принципе, он полностью разрушает весь мой проект.
Итак, чтобы выяснить, как использовать Swift Package Manager, я играю с ним в тестовом проекте.
Вот что я пробовал:
- Создайте новый проект из Xcode
Файл → Создать → Проект → Приложение Cocoa
Наименование продукта: basic-ssh-test
Это создает базовое приложение, которое загружает пустое окно, когда я нажимаю "Выполнить". Просто для удовольствия я добавил print("test")
к функции applicationDidFinishLaunching
в своем AppDelegate
поэтому окно отладки говорит "тест", когда я запускаю программу.
Теперь я хочу добавить пакет 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
каталог .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
с единственным быстрым файлом в нем 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, которую мы делаем ранее.
После того, как вы добавите файлы, вы можете получить доступ к коду, как обычно, когда пишете его самостоятельно, как показано ниже. Импорт не требуется. Вы можете посмотреть более подробную информацию в здесь. Надеюсь, поможет.
Ответ 3
Вы можете создать оконное приложение, используя SPM (у меня есть весь проект, ожидающий ABI, который это делает) вам просто нужна плита котла в swift.main. Я выкапываю.
Однако метод, о котором говорят другие, никогда не будет работать (с текущими версиями SPM).
Однако то, что я вижу, заключается в том, что вы действительно хотите использовать SPM для управления зависимостями (сохраняя актуальность и т.д.). Поэтому я думаю, что вы могли бы сделать это гораздо легче.
Вместо того, чтобы создавать исполняемый файл в качестве целевой по умолчанию, вместо этого создайте библиотеку (возможно, называйте ее базовыми-ssh-зависимостями). Создайте проект Xcode и перетащите THAT в свой основной проект Xcode и настройте свою цель, чтобы зависеть от нее. Когда вы обновляете библиотеку из SPM для изменений зависимостей, вы должны переименовать свой Xcode-proj.
Сообщите мне свой пробег и любые морщины, или если я неправильно понял, чего вы пытаетесь достичь.