Я пишу фреймворк и мне нравится делить фреймворк на маленькие отдельные подмодули (цели). Apple предоставляет классное описание того, чего я хочу достичь с помощью CocoaPods:
Цели являются основными строительными блоками пакета. Цель может определить модуль или набор тестов. Цели могут зависеть от других целей в этом пакете и от продуктов в пакетах, от которых зависит этот пакет.
Я мог бы легко сделать это с помощью Swift Package Manager:
targets: [
.target(name: "Network"),
.target(name: "Service", dependencies: ["Network"])
],
Iможно использовать import Network
в цели Service
, и это здорово, потому что они являются отдельными модулями, логика ясна.
Как этого добиться в CocoaPods и Carthage (я пишу фреймворк, а не финальныйприложение)?
Что я пробовал:
Подспец
Я пытался использовать Подспец :
s.subspec 'Service' do |ss|
ss.dependency 'MyFramework/Network'
ss.source_files = 'Sources/Service/**/*.swift'
end
s.subspec 'Network' do |ss|
ss.source_files = 'Sources/Network/**/*.swift'
end
Это не работает так, как я хочу, потому что CocoaPods просто объединяет все файлы в одну структуру (просто разделяет его на отдельные папки), поэтому:
- Я получаю коллизии пространства имен.
- Неустранимая ошибка, когда я пытаюсь
import Network
внутри Service
, потому что после pod install
нет цели Network
. Так что я не могу использовать тот фреймворк со Swift Package Manager. CocoaPods просто объединяет все в одну цель MyFramework
, как я упоминал ранее.
Отдельные репозитории / pods
Это решение, но очень трудно поддерживать несколько отдельных репозиториев git и создавать отдельныесовершать и толкать. Я хочу держать все в одном репо.