首页 > 解决方案 > CocoaPods:如何将每个子规范构建为自己的框架目标

问题描述

我在为我的项目创建 CocoaPods .podspec 文件时遇到问题,以便它在由 CocoaPods 安装时使用与原始项目中相同的模块结构构建。

我正在构建一个包含多个框架的 SDK:

MyThingSDK.xcodeproj
  -> Target: Framework "Core.framework"
             Builds files in MyThing/Core/*.swift
  -> Target: Framework "Designer.framework"
             Builds files in MyThing/Designer/*.swift
  -> Target: Framework "Runner.framework"
             Builds files in MyThing/Runner/*.swift

在构建这个结束时,我有三个以每个目标命名的框架

MyThingSDK.podspec 看起来像:

Pod::Spec.new do |s|

  s.name         = "MyThingSDK"
  s.version      = "0.1.1"
  ...

  s.subspec "Core" do |spec|
    spec.source_files   = "MyThing/Core/**/*.{h,m,swift}"
    spec.public_header_files = "MyThing/Core/*.{h}"
    spec.header_dir = "Core"
  end

  s.subspec "Designer" do |spec|
    spec.source_files   = "MyThing/Designer/**/*.{h,m,swift}"
    spec.public_header_files = "MyThing/Designer/*.{h}"
    spec.header_dir = "Designer"
    spec.dependency "MyThing/Core"
  end

  s.subspec "Runner" do |spec|
    spec.source_files   = "MyThing/Runner/**/*.{h,m,swift}"
    spec.public_header_files = "MyThing/Runner/**/*.{h}"
    spec.header_dir = "Runner"
    spec.dependency "MyThing/Core"
  end

end

当我使用 pod install 在客户端项目中使用它时,我最终得到了这个结构:

ClientProject.xcworkspace
  ClientProject.xcproject
  Pods.xproject
    -> Target: Framework "MyThingSDK.framework"
               Builds files from MyThing/Core/*.swift
               Builds files from MyThing/Designer/*.swift
               Builds files from MyThing/Runner/*.swift

Podfile 像这样引用 SDK:

pod 'MyThingSDK', :path => '/Volumes/Dev/src/MyThingSDK'

因此,当 CocoaPods 创建其 Pods 项目时,所有源文件都进入一个框架,而不是每个子规范都有自己的框架。这会产生重复定义问题。假设 Designer 和 Runner 都有一个名为“Client”的类——当它们是独立的框架时这很好,但当它们合并为一个时就不行了。

如何为每个子规范保留一个框架?

标签: iosswiftxcodeframeworkscocoapods

解决方案


子规范的主要目的之一是启用单个框架的配置。如果您想要单独的框架,您应该为每个框架使用单独的 podspec。


推荐阅读