Пакет Swift с подмодулями, как в CocoaPods

Я пытаюсь перевести созданный мной Pod в Swift Package Manager (SPM), но не знаю, как перевести функцию subspec из CocoaPods в SPM. Я знаю, что SPM предоставляет несколько целей, но, кстати, это не то же самое, что функция subspec.

Скажем, у меня есть следующие спецификации:

Pod::Spec.new do |s|
    s.name = 'Example'
    ...

    # main spec
    s.subspec 'Main' do |ss|
        ss.source_files = 'Source/Main/**/*.swift'
        ss.pod_target_xcconfig = {
            'SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug]' => 'DEBUG'
        }

        # dependencies
        ss.dependency 'CocoaLumberjack/Swift'
    end

    # coredata
    s.subspec 'CoreData' do |ss|
        ss.source_files = 'Source/CoreData/**/*.swift'
        ss.pod_target_xcconfig = {
            'SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug]' => 'EXAMPLE_WITH_COREDATA',
            'SWIFT_ACTIVE_COMPILATION_CONDITIONS' => 'EXAMPLE_WITH_COREDATA'
        }

        # dependencies
        ss.dependency 'Example/Core'
        ss.dependency 'MagicalRecord', '> 2.3'
    end
end

Если разработчик зависит от подспецификации CoreData, он автоматически включит подспецификацию Main, но также установит некоторые флаги для модуля. Таким образом, модуль Main знает, что доступны дополнительные функции, и интегрирует их. Быстрый пример кода из подспецификации Main:

func someFunction() {
    // ... some code ...

    #if EXAMPLE_WITH_COREDATA
        callExtraCoreDataRelatedMethod()
    #endif

    // ... some code ...
}

person djbe    schedule 29.09.2016    source источник


Ответы (1)


Это не то, что еще поддерживается диспетчером пакетов Swift (настройка поведения цели в зависимости от того, как она используется другими целями).

Если у вас есть пакет, который вы хотите сделать это, сейчас вам нужно сделать это через какую-то регистрацию во время выполнения, где модуль CoreData зарегистрирует в модуле Main факт, что ему нужен этот другой бит поведения.

person Daniel Dunbar    schedule 01.10.2016
comment
Хм, ладно. Помимо поведения (модуля), как насчет зависимостей? Как я могу определить несколько модулей в моем пакете и позволить пользователю включать только те модули, которые им нужны? Справочная документация SPM описывает несколько целей, но не то, как зависеть от одной из этих целей. - person djbe; 02.10.2016
comment
Это еще не реализовано, хотя мы осознаем необходимость этого и активно работаем над тем, чтобы понять, как это должно выглядеть. - person Daniel Dunbar; 03.10.2016
comment
Есть ли проблема в системе отслеживания ошибок или в ветке списка рассылки, за которой я могу следить? - person djbe; 03.10.2016
comment
Спасибо! Здесь также есть предложение: github.com/aciidb0mb3r/swift-evolution/blob/ - person djbe; 06.10.2016