Как архивировать макросы в статическую библиотеку в виде xcframework?

Вопрос или проблема

Я пытаюсь создать 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 из вашей статической библиотеки с макросами. Если у вас возникнут дополнительные вопросы или проблемы, пожалуйста, дайте знать.

Оцените материал
Добавить комментарий

Капча загружается...