Пакет Swift — распространять автономный исполняемый файл с пакетом

#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. Да, сейчас я включаю текст необработанного шаблона в качестве переменных в свой код… не очень удобно, но проще, чем писать реальное приложение