Вопрос или проблема
Я пытаюсь создать xcframework из моей статической библиотеки (SPM, кстати) с макросами. Мой скрипт не работает правильно.
Моя декларация макросов SPM
// swift-tools-version: 5.9
// Версия инструментов Swift объявляет минимальную версию Swift, необходимую для сборки этого пакета.
import CompilerPluginSupport
import PackageDescription
let package = Package(
name: "SomeMacr",
platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .macCatalyst(.v13)],
products: [
.library(
name: "SomeMacr",
targets: ["SomeMacr"]
),
.executable(
name: "SomeMacrClient",
targets: ["SomeMacrClient"]
)
],
dependencies: [
.package(url: "https://github.com/apple/swift-syntax.git", from: "509.0.0")
],
targets: [
.macro(
name: "SomeMacrMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
),
.target(name: "SomeMacr", dependencies: ["SomeMacrMacros"]),
.executableTarget(name: "SomeMacrClient", dependencies: ["SomeMacr"]),
.testTarget(
name: "SomeMacrTests",
dependencies: [
"SomeMacrMacros",
.product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax")
]
)
]
)
Мой .sh скрипт
xcodebuild archive \
-scheme $1 \
-sdk iphoneos \
-archivePath "Products/archives/ios_devices.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-scheme $1 \
-sdk iphonesimulator \
-archivePath "Products/archives/ios_simulators.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-scheme $1 \
-sdk macosx \
-archivePath "Products/archives/macos.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
-library Products/archives/ios_devices.xcarchive/Products/Library/Frameworks/lib$1.a \
-library Products/archives/ios_simulators.xcarchive/Products/Library/Frameworks/lib$1.a \
-library Products/archives/macos.xcarchive/Products/Library/Frameworks/lib$1.a \
-output Products/xc/$1.xcframework
Он требует назначения (но в других уроках авторы ясно показывают, что после этого скрипта я получу xcframework).
xcodebuild: error: Для сборки пакета Swift необходимо указать назначение с помощью параметра "-destination". Параметр "-showdestinations" может быть использован для отображения доступных назначений
Но когда я установил назначение, он был скомпилирован в исполняемый файл, который я не знаю, как включить в другой пакет SPM / или xcframework.
Что я делаю не так?
Ответ или решение
Чтобы создать xcframework из вашей статической библиотеки, которая использует макросы, вам необходимо исправить свой скрипт и добавить несколько необходимых параметров. Вот все шаги, которые вам следует выполнить:
1. Исправление скрипта
Ваш текущий скрипт имеет некоторые недочеты, включая отсутствие задания -destination
для xcodebuild
. Также следует обеспечить корректное указание путей к библиотекам. Вот исправленный вариант вашего скрипта:
#!/bin/bash
PACKAGE_NAME=$1
# Архивирование для iOS устройств
xcodebuild archive \
-scheme "$PACKAGE_NAME" \
-sdk iphoneos \
-archivePath "Products/archives/ios_devices.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
-destination generic/platform=iOS
# Архивирование для iOS симуляторов
xcodebuild archive \
-scheme "$PACKAGE_NAME" \
-sdk iphonesimulator \
-archivePath "Products/archives/ios_simulators.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
-destination generic/platform=iOS Simulator
# Архивирование для macOS
xcodebuild archive \
-scheme "$PACKAGE_NAME" \
-sdk macosx \
-archivePath "Products/archives/macos.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
-destination generic/platform=macOS
# Создание xcframework
xcodebuild -create-xcframework \
-library "Products/archives/ios_devices.xcarchive/Products/Library/Frameworks/lib$PACKAGE_NAME.a" \
-library "Products/archives/ios_simulators.xcarchive/Products/Library/Frameworks/lib$PACKAGE_NAME.a" \
-library "Products/archives/macos.xcarchive/Products/Library/Frameworks/lib$PACKAGE_NAME.a" \
-output "Products/xc/$PACKAGE_NAME.xcframework"
2. Объяснение изменений
- Параметр -destination: Этот параметр указывает, что вы собираетесь создать библиотеку для определенной платформы. Использование
generic/platform=iOS
,generic/platform=iOS Simulator
иgeneric/platform=macOS
поможет избежать ошибки, которую вы получали. - Использование переменной $PACKAGE_NAME: Убедитесь, что передаете имя вашего пакета в качестве первого аргумента скрипта. Таким образом, код будет более удобным и универсальным.
3. Проверка вывода
Перед выполнением скрипта убедитесь, что у вас есть все необходимые зависимости установлены и что ваш проект компилируется без ошибок. Выполните скрипт с указанием имени вашего пакета:
./your_script.sh SomeMacr
4. Результат
После успешного выполнения скрипта, в папке Products/xc/
должен появиться файл SomeMacr.xcframework
. Вы сможете использовать этот xcframework в других Swift пакетах или проектах.
Заключение
Эти шаги позволят вам корректно создать xcframework из вашей статической библиотеки с макросами. Если у вас возникнут дополнительные вопросы или проблемы, пожалуйста, дайте знать.