Менеджер пакетов Swift: создайте пользовательский фреймворк - PullRequest
0 голосов
/ 21 мая 2018

Я хочу создать пользовательский фреймворк в Swift, чтобы я мог использовать его в нескольких проектах.Поэтому я начал с

mkdir TestFramework && cd TestFramework
swift package init --type library

и

swift package generate-xcodeproj

Затем я начал создавать там некоторые классы и собирал код.В результате получается файл .framework.Я переместил его в другой проект и связал там (поэтому я просто копирую папку .framework в проект Xcode и добавляю ее к цели).import TestFramework работает, но у меня нет доступа к каким-либо классам, которые я создал в Framework: Use of unresolved identifier 'TestClass'

Странная вещь: TestFramework.framework/Versions/A/TestFramework кажется исполняемым файлом.Это Package.swift:

let package = Package(
    name: "TestFramework",
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "TestFramework",
            targets: ["TestFramework"]),
    ],

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Убедитесь, что ваши классы и другие типы public, включая методы и инициализаторы.

При работе с фреймворками избегание использования testable в модульных тестах помогает при тестировании общедоступного интерфейса, как его видят потребляющие приложения.

0 голосов
/ 04 июня 2018

Лучший способ приблизиться к этому - использовать рабочую область верхнего уровня XCode (Файл -> Создать -> Рабочая область).Поэтому создайте рабочее пространство с именем Example.

В качестве второго шага создайте каталог с именем lib и поместите его в каталог Example.Размещение его внутри каталога не является строго обязательным, но я делаю это, чтобы сохранить файлы в одном каталоге проекта.Затем запустите в каталоге lib:

swift package init --type library

и добавьте некоторый код для создания вашей платформы.

Далее создайте новый проект, используя Xcode.Поэтому File -> New -> Project и сохраните этот проект также в каталоге Example (Опять же, не обязательно помещать его в Example).Сейчас давайте предположим, что вы создаете приложение какао с именем TestUI.

Теперь откройте пример рабочего пространства и добавьте два проекта в рабочее пространство, используя File -> Add Files to «Example».Вы должны добавить сгенерированный lib.xcodeproj для каталога lib и TestUI.xcodeproj для TestUI.

С этого момента Xcode автоматически позаботится обо всем.Он будет хранить все файлы из обоих проектов в одном каталоге сборки, и вы можете создать / запустить / собрать / отладить ваше приложение, как вы ожидаете.

Структура должна выглядеть следующим образом:

Example
|-- Example.xcworkspace
|-- TestUI
|   |-- TestUI
|   |   |-- AppDelegate.swift
|   |   |-- Assets.xcassets
|   |   |   |-- AppIcon.appiconset
|   |   |   |   `-- Contents.json
|   |   |   `-- Contents.json
|   |   |-- Base.lproj
|   |   |   `-- Main.storyboard
|   |   |-- Info.plist
|   |   |-- MailboxViewController.swift
|   |   |-- TestUI.entitlements
|   |   `-- ViewController.swift
|   `-- TestUI.xcodeproj
`-- lib
    |-- lib.xcodeproj
    |-- Package.resolved
    |-- Package.swift
    |-- README.md
    |-- Sources
    |   |-- ExampleLib
    |   |   |-- Account.swift
    |   |   |-- Credentials.swift

У этого подхода есть одно существенное ограничение.Если в вашей библиотеке нет компонентов Swift, например, оболочки вокруг C-библиотеки, она не будет работать из коробки.Вы получите сообщения типа «Не удается найти необходимый Framework xxx», если вы попытаетесь его использовать.Это также может произойти, если вы добавите в свою библиотеку несколько обязательных пакетов на основе 'C'.

Я нашел следующую работу вокруг.Сначала перейдите в каталог lib и выполните следующую команду:

find lib.xcodeproj -name module.modulemap

В случае, если вы использовали / создали библиотеку xxx, вы получите следующий вывод:

lib.xcodeproj/GeneratedModuleMap/xxx/module.modulemap

Теперь перейдите в рабочую область «Пример» и выберите TestUI -> «Настройки сборки» -> «Все» и введите в поле поиска «Другие флаги Swift».

Откройте его и добавьте следующие два поля:

-Xcc
-fmodule-map-file=$(SRCROOT)/../lib/lib.xcodeproj/GeneratedModuleMap/xxx/module.modulemap

И это все.Теперь все должно работать.Для компиляции и запуска даже нет необходимости вставлять двоичные файлы в приложение TestUI, хотя я предполагаю, что это будет необходимо для распространения.

...