Как делиться кодом между внутренними файлами Package.swift

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

У меня есть проект с множеством внутренних пакетов Swift. В каждом файле Package.swift я определяю определенные вещи, такие как настройки Swift, которые хочу использовать для этого пакета, а также вспомогательные функции для генерации продуктов, целей модульных тестов и т. д. Например, в каждом файле пакета у меня есть:

extension [SwiftSetting] {

    /// Набор стандартных настроек Swift для модулей.
    static let `default`: [SwiftSetting] = [
        .existentialAny,
        .internalImportsByDefault
    ]
}

Однако переписывать это в каждом отдельном файле пакета очень неудобно. Я задумался, существует ли способ поделиться кодом между всеми внутренними файлами пакетов, чтобы упростить и оптимизировать этот процесс. Не уверен, возможно ли это, но в файлах Package.swift мы можем импортировать PackageDescription, который предоставляет все основные типы, определяющие пакет. Существует ли способ импорта наборов пользовательского кода так же, как и PackageDescription?

Ответ или решение

Как делиться кодом между внутренними файлами Package.swift

Если вы работаете над проектом, состоящим из множества внутренних Swift-пакетов, вам может показаться утомительным дублировать код, например, настройки Swift, функции для генерации продуктов и тестов, в каждом файле Package.swift. Как правило, для упрощения и централизации кода разработчики ищут способы его повторного использования. В статической экосистеме Swift, к сожалению, прямое импортирование пользовательских модулей внутри файлов Package.swift невозможно. Тем не менее, существуют решения, которые могут помочь оптимизировать вашу работу.

Решение: Использование файлов с расширениями

  1. Создание директории для общего кода: В проекте, где находятся ваши пакеты, создайте директорию, например, Common, в которой будете хранить общие файлы Swift. Это может быть папка, расположенная на одном уровне с вашими пакетами.

  2. Создание файла с расширениями: Внутри этой директории создайте файл, например, SwiftSettings.swift, в котором вы будете определять ваши расширения и вспомогательные функции. Вот как это может выглядеть:

    import PackageDescription
    
    extension Collection where Element == SwiftSetting {
        /// Стандартный набор настроек Swift для модулей.
        static let `default`: [SwiftSetting] = [
            .existentialAny,
            .internalImportsByDefault
        ]
    }
  3. Ссылки на общие настройки в каждом пакете: В каждом Package.swift, где вам нужно использовать эти настройки, добавьте путь к общему коду. Несмотря на то, что вы не можете традиционным образом импортировать файлы Swift, вы можете использовать их как модули.

    Включите соответствующий путь к Common каталогу как источник в вашем Package.swift:

    let package = Package(
        name: "MyPackage",
        platforms: [...],
        products: [...],
        dependencies: [...],
        targets: [
            .target(
                name: "MyModule",
                dependencies: [],
                path: "Sources/MyModule",
                sources: ["../Common/SwiftSettings.swift"]
            ),
            .testTarget(
                name: "MyModuleTests",
                dependencies: ["MyModule"]
            ),
        ]
    )

Подход через размещение общего кода в пакете

Если вы хотите иметь более структурированное решение, вы можете создать отдельный Swift-пакет, который будет содержать общие настройки и виды. Здесь шаги:

  1. Создание общего пакета: Запустите команду для создания нового пакета:

    swift package init --type library --name CommonSettings
  2. Добавление кода в общий пакет: Переместите ваш код из библиотеки, например, SwiftSettings.swift, в этот новый пакет.

  3. Импорт общего пакета в другие пакеты: В каждый внутренний Package.swift, где вы хотите использовать общие настройки, добавьте зависимость:

    dependencies: [
        .package(path: "../CommonSettings")
    ]

И используйте его в своем коде:

import CommonSettings

let settings = SwiftSetting.default

Заключение

Обмен кодом между файлами Package.swift может быть достигнут с помощью создания общей директории или отдельного пакета. Эти подходы значительно упростят поддержку и улучшат читаемость вашего кода, избегая дублирования. Следуя вышеизложенным методам, вы сможете быстро и эффективно использовать одни и те же настройки в различных пакетах вашего проекта, что приведет к повышению продуктивности разработки и уменьшению времени на отладку.

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

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