Цель SPM, которая действует как umbrella framework

#ios #swift #swift-package-manager

#iOS #swift #swift-package-manager

Вопрос:

Идея проста. Я хочу создать target в SPM, который имеет некоторые зависимости и может быть импортирован в конечный продукт как отдельный модуль.

Так, например, у меня есть модуль под названием «Core», который имеет 2 зависимости: «утилиты» и «расширения». Чтобы знать, как использовать Core, вы также должны импортировать «утилиты» и «расширения», подобные этому:

 import Core
import Utilities
import Extensions
 

Чего я хочу, так это сделать так, чтобы это выглядело как в Cocoapods (спецификации и подвиды).

 import Core
 

Пример Package.swift

 let package = Package(
    name: "SomeFramework",
    platforms: [.iOS(.v13)],
    products: [
        .library(
            name: "Core",
            targets: ["Core"]
        ),
        
        .library(
            name: "Utilities",
            targets: ["Utilities"]
        ),
        
        .library(
            name: "HandyExtensions",
            targets: ["HandyExtensions"]
        ),
    ],
    targets: [
    
    // Core
    
    .target(
        name: "Core",
        dependencies: [
            "HandyExtensions",
            "Utilities"
        ],
        path: "Core",
        exclude: ["Info.plist"]
    ),
    
    // Utilities
    
    .target(
        name: "Utilities",
        path: "Utilities",
        exclude: ["Support files/Info.plist"]
    ),
    
    // HandyExtensions
    
    .target(
        name: "HandyExtensions",
        path: "HandyExtensions",
        exclude: ["Support files/Info.plist"]
    )
 ]
 

Ответ №1:

Я до сих пор не нашел решения своей проблемы, но вот что я сделал.

Я посмотрел на подход, который использует Firebase. Идея состоит в том, чтобы разделить все Cocoapods подмодули на отдельные Cocoapods фреймворки и добавить их как подмодули с зависимостями в main podspec . Это решит проблему с одной кодовой базой для SPM и Cocoapods.

К сожалению, в коде вам все равно нужно использовать Core , Utilities , HandyExtension отдельно.