#swift #bundle #software-distribution #swift-package-manager
#swift #пакет #программное обеспечение-распространение #swift-package-manager
Вопрос:
Я пишу сценарий Swift как отдельный пакет Swift. Часть этого скрипта должна генерировать некоторые файлы, для которых у меня есть шаблоны.
Теперь эти шаблоны не компилируются (это HTML-файлы); поэтому, чтобы включить их в пакет, я включил их как .copy("Templates")
.
При отладке моего скрипта я могу получить доступ к шаблонам просто отлично, но когда я пытаюсь заархивировать продукт, исполняемый файл больше не имеет к ним доступа.
Вот мой пакет.swift:
let package = Package(
name: "flucs",
products: [
.executable(name: "Flucs",
targets: ["flucs"])
],
dependencies: [
.package(url: "https://github.com/MrSkwiggs/Netswift", .exact(.init(0, 3, 1))),
],
targets: [
.target(
name: "flucs",
dependencies: ["Netswift"],
path: "Sources",
resources: [
.copy("Templates")
]),
.testTarget(
name: "flucsTests",
dependencies: ["flucs"]),
]
)
Моя структура папок:
Как я могу распространить свой скрипт так, чтобы он также включал свои ресурсы?
Ответ №1:
SPM компилирует ваши ресурсы в отдельный пакет, но инструмент командной строки — это просто исполняемый файл без пакета, и любые ресурсы, которые вы добавляете в свой исполняемый файл, просто игнорируются Xcode (Этапы сборки> Копировать ресурсы пакета) для выпуска (архивирования) сборок.
Если вы заглянете внутрь Bundle.module
, вы можете найти:
...
// For command-line tools.
Bundle.main.bundleURL,
...
Где Bundle.main.bundleURL
указан допустимый URL-адрес файла для каталога, содержащего исполняемый файл командной строки, чтобы он искал ваш пакет рядом с вашим исполняемым файлом. И это работает для отладки, потому что XCode просто компилирует ваш пакет ресурсов рядом с вашим исполняемым файлом.
Самый простой способ получить исполняемый файл для выпуска с помощью скомпилированного .bundle
файла — это создать ваш пакет из командной строки:
swift build --configuration release
И затем вы можете найти их оба в .build/release
папке.
Комментарии:
1. Но так, если я хочу распространять свой скрипт, означает ли это, что я всегда должен делать это вместе с пакетом?? Это не очень удобно :/
2. @Skwiggs Одним из возможных решений с пакетом Swift является перенос ваших шаблонов в виде строк в ваш код, и они будут скомпилированы в двоичный файл. Но вы всегда можете избавиться от пакета Swift и создать приложение (.app), которое поддерживает пакеты вместо командной строки (чистый двоичный файл).
3. Да, сейчас я включаю текст необработанного шаблона в качестве переменных в свой код… не очень удобно, но проще, чем писать реальное приложение