Как я могу включить стабильность ABI для пакета SwiftPM?

#swift #swift-package-manager

#swift #swift-package-manager

Вопрос:

Учитывая мое стандартное описание пакета bog

 
let package = Package(
    name: "MyLib",
    products: [
        .library(name: "MyLib", targets: ["MyLib"]),
    ],
    dependencies: [],
    targets: [
        .target(
            name: "MiniRxSwift",
            dependencies: [],
            swiftSettings: [
                .define("<see below>")
            ]),
   ...
 

Я пытаюсь заставить swiftpm передать -enable-library-evolution флаг через swiftc , но мне это не удалось.

Используя swiftSettings of .define("-enable-library-evolution") , я получаю ошибку компиляции, которая гласит: «ошибка: флаги условной компиляции должны быть допустимыми идентификаторами Swift (а не ‘-enable-library-evolution’)»

Я получаю ту же ошибку, если опускаю начальный дефис, например `.define(«enable-library-evolution»)

Я попробовал настройку Xcode .define(«BUILD_LIBRARIES_FOR_DISTRIBUTION»), которая не приводит к ошибке компиляции, но также не приводит к установке флага, вместо этого это приводит к -DBUILD_LIBRARIES_FOR_DISTRIBUTION командной строке для swiftc, которая ничего не делает.

После небольшого исследования я выяснил, что .define in swiftSettings встроен для создания вещей с -D помощью — отсюда и его название.

Вместо этого мне нужно было использовать unsafeFlags, что действительно приводит к правильной передаче флага компилятору swift:

 swiftSettings: [
    .unsafeFlags(["-enable-library-evolution"])
]
 

НО затем, когда я пытаюсь использовать этот пакет, Xcode не загружает пакет с ошибкой:

Продукт пакета ‘MyLib’ не может использоваться в качестве зависимости от этой цели, поскольку он использует небезопасные флаги сборки.

Если я не могу включить эволюцию библиотеки без небезопасных флагов сборки и не могу использовать небезопасные флаги сборки в библиотеке, то что я могу сделать? Какой смысл иметь небезопасные лаги, если вы не можете использовать какие-либо библиотеки, которые их устанавливают?

Ответ №1:

Зачем вам нужна стабильность ABI, если у вас есть доступ к пакету? Вы должны избегать этого, если это возможно. Тем не менее, вы должны иметь возможность использовать небезопасные флаги с редактируемыми пакетами (теми, которые вы перетащили в проект), но не с теми, которые вы включаете обычным способом через URL.

Если вам нужно отправить кому-то пакет swift в виде двоичного файла, вам нужно будет создать свой пакет как XCFramework, а затем вы можете поместить его в место, где SwiftPM может зависеть от него. Это означает, что он может быть размещен в статическом месте, где вы указываете URL-адрес, или он может быть встроен в репозиторий git с Package.swift манифестом, который у вас есть для продажи пакета. Единственный известный мне инструмент, помогающий в этом, находится здесь, который работает только для пакета Swift, когда я его использовал.