Вопрос или проблема
У меня есть проект с множеством внутренних пакетов 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 невозможно. Тем не менее, существуют решения, которые могут помочь оптимизировать вашу работу.
Решение: Использование файлов с расширениями
-
Создание директории для общего кода: В проекте, где находятся ваши пакеты, создайте директорию, например,
Common
, в которой будете хранить общие файлы Swift. Это может быть папка, расположенная на одном уровне с вашими пакетами. -
Создание файла с расширениями: Внутри этой директории создайте файл, например,
SwiftSettings.swift
, в котором вы будете определять ваши расширения и вспомогательные функции. Вот как это может выглядеть:import PackageDescription extension Collection where Element == SwiftSetting { /// Стандартный набор настроек Swift для модулей. static let `default`: [SwiftSetting] = [ .existentialAny, .internalImportsByDefault ] }
-
Ссылки на общие настройки в каждом пакете: В каждом
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-пакет, который будет содержать общие настройки и виды. Здесь шаги:
-
Создание общего пакета: Запустите команду для создания нового пакета:
swift package init --type library --name CommonSettings
-
Добавление кода в общий пакет: Переместите ваш код из библиотеки, например,
SwiftSettings.swift
, в этот новый пакет. -
Импорт общего пакета в другие пакеты: В каждый внутренний
Package.swift
, где вы хотите использовать общие настройки, добавьте зависимость:dependencies: [ .package(path: "../CommonSettings") ]
И используйте его в своем коде:
import CommonSettings
let settings = SwiftSetting.default
Заключение
Обмен кодом между файлами Package.swift
может быть достигнут с помощью создания общей директории или отдельного пакета. Эти подходы значительно упростят поддержку и улучшат читаемость вашего кода, избегая дублирования. Следуя вышеизложенным методам, вы сможете быстро и эффективно использовать одни и те же настройки в различных пакетах вашего проекта, что приведет к повышению продуктивности разработки и уменьшению времени на отладку.