【问题标题】:How to make framework in CocoaPods that has multiple targets?如何在具有多个目标的 CocoaPods 中制作框架?
【发布时间】:2020-12-10 19:01:16
【问题描述】:

我编写了一个框架,我喜欢将框架划分为小的独立子模块(目标)。 Apple 为我想用 CocoaPods 实现的目标提供了一个很酷的描述:

目标是包的基本构建块。一个目标可以定义一个模块或一个测试套件。 目标可以依赖于此包中的其他目标,以及此包所依赖的包中的产品。

我可以使用 Swift 包管理器轻松做到这一点:

    targets: [
        .target(name: "Network"),
        .target(name: "Service", dependencies: ["Network"])
    ],

我可以在Service 目标中使用import Network,这很酷,因为它们是独立的模块,逻辑清晰。

如何在 CocoaPods 和 Carthage 中实现(我写的是框架,不是最终的应用)?

我尝试过的:

子规范

我尝试使用subspecs

  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 只是将所有文件合并到一个框架中(只是将其划分到单独的文件夹中),所以:

  1. 我收到命名空间冲突。
  2. 当我尝试在Service 中使用import Network 时出现致命错误,因为在pod install 之后没有Network 目标。所以我不能将那个框架与 Swift 包管理器一起使用。正如我之前提到的,CocoaPods 只是将所有内容合并到一个目标 MyFramework

单独的 repos/pods

这是解决方案,但很难维护多个单独的 git 存储库并进行单独的提交和推送。我想把所有东西都放在一个仓库里。

【问题讨论】:

  • 有什么理由不想将它们分开捆绑?那么,你可以有一个用于 Network 的 Pod,然后你会声明一个单独的 Service Pod,它本身会使用 Network 作为 Pod? :)

标签: ios swift cocoapods carthage swift-package-manager


【解决方案1】:

我很确定 CocoaPods 没有能力为一个 podspec 创建单独的目标。

正如您在上面提到的,您可以创建单独的 podspec,但在一个存储库中,例如 RxSwift。然后,在您进行开发时,您可以使用一些包含所有 podspecs 的示例项目。您无需管理不同的存储库。

另外,您可以尝试使用不同的模块创建模块映射,例如:

framework module Something {
    framework module Core { ... }
    framework module Toolbox { ... }
    ...
}

然后在podspec中赋值,例如:

Pod::Spec.new do |s|
  s.module_map = "#{s.name}/#{s.name}.modulemap"
...

但我不确定。我只尝试了RxSwift 存储库中的第一种方法。

【讨论】:

    【解决方案2】:

    在 pod 文件中使用以下方法,为每个目标指定不同的 pod。 您也可以创建多个def,并在每个def中添加不同的pod,可以单独使用。

    在提供的示例中,我有 2 个共享 pod 和 2 个目标

    • target1_name 是一个目标

    • target2_name 是另一个目标的名称

    • shared_pods pod 列表

    • shared_pods_2 另一个 pod 列表

      use_frameworks!    
      
      def shared_pods
       # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
      
       pod 'RealmSwift'
       pod 'Alamofire'
       pod 'ReachabilitySwift'
       pod 'SDWebImage'       
      end
      
      def shared_pods_2
       pod 'Fabric'
       pod 'Crashlytics'
       pod 'CryptoSwift'
      end
      
      target 'target1_name' do
       shared_pods
      end
      
      target 'target2_name' do
       shared_pods_2
      end
      

    【讨论】:

    • 感谢您的回答,但这是一个 Podfile,用于使用 pod,而问题是关于 podspec,用于创建 pod
    猜你喜欢
    • 2015-08-04
    • 2018-06-12
    • 2023-01-08
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多