像 CocoaPods 一样带有子模块的 Swift 包

标签 swift cocoapods swift-package-manager

我正在尝试将我正在创建的 Pod 转换为 Swift Package Manager (SPM),但不知道如何将 subspec 功能从 CocoaPods 转换为 SPM。我知道 SPM 提供了多个目标,但据我所知,这与 subspec 功能不同。

假设我有以下 podspec:

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 子规范,但也会为 pod 设置一些标志。这样,Main pod 就知道有额外的功能可用,并将其集成。 Main 子规范中的代码快速示例:

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

    #if EXAMPLE_WITH_COREDATA
        callExtraCoreDataRelatedMethod()
    #endif

    // ... some code ...
}

最佳答案

Swift 包管理器尚不支持此功能(根据其他目标的使用方式自定义目标的行为)。

如果你有一个你想要这样做的包,现在你必须通过某种运行时注册来完成,其中 CoreData 模块将向 Main< 注册事实 模块,它需要其他一些行为。

关于像 CocoaPods 一样带有子模块的 Swift 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777816/

相关文章:

ios - 名为 runner 的 SKSpriteNode 以相反的方式移动

ios - UISearchController 中的 SearchBar 委托(delegate)不起作用

ios - 在所有应用程序界面 swift2 中保持像页脚一样的底部 View

ios - 是否有 Opencv 的 podspec?

ios - 错误 : in auto-import: failed to get module from AST context:

Swift 包无法为 watchOS 编译

ios - 无法在现有的 tableviewcontroller 上呈现 .xib viewcontroller

ios - Flutter pod 安装问题和 ios 应用程序未运行

swift-package-manager - 使用 SwiftPM 导出公共(public) C 头文件

swift - 使用 Swift 包管理器将 Swift 3 包添加到 Xcode 8