#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, когда я его использовал.