iOS - pod package 把私有库打包为 framework

施阳曜
2023-12-01

1. 安装 cocoapods-packager

如果没有安装 cocoapods-packager ,可以使用如下命令安装:

$ gem install cocoapods-packager

2. podspec文件的内容结构

#
# Be sure to run `pod lib lint ASDK.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'ASDK'
  s.version          = '0.1.0'
  s.summary          = 'A short description of ASDK.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/xxx/ASDK'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'xxxx' => 'xxxx@163.com' }
  # s.source 中是表示使用 pod package 打包时候 pod 去寻找的打包的路径。
  # podspec 默认使用 git commit tag 作为路径。
  # 也可以修改成本地路径 'file:///Users/xxx/Desktop/ASDK'。
  # 如果当前没有设置 :tag ,打包时候默认使用当前 git commit 的 head 节点,
  #  (如果部分修改内容没有 commit,那么使用 git package 不会将未 commit 的内容进行打包)
  s.source           = { :git => 'file:///Users/xxx/Desktop/ASDK'}
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  # 支持的平台的最低部署目标
  s.ios.deployment_target = '9.0'
  
  # Pod的源文件,注意源码一般放到 Classes 文件夹目录下
  # 而且实体文件中不要有非源码内容放到 Classes 文件夹
  s.source_files = 'ASDK/Classes/**/*'
  
  # --- 资源添加方式一 ---
  # cocoapods 会将 Assets 中的内容自动打包成 ASDK.bundle
  # s.resource_bundles = {
  #   'ASDK' => [
  #      'ASDK/Assets/*.png',
  #   ]
  # }
  # --- 资源添加方式二 ---
  # 在 Assets 文件夹中放入我们自己写好的 ASDK.bundle,bundle 中是我们使用的资源。
  # 使用 s.resource = 'ASDK/Assets/ASDK.bundle' 会将这些资源打入 framework 中。
  # 在 Example 中手动引用我们自己创建的 ASDK.bundle 资源文件。
  s.resource = 'ASDK/Assets/ASDK.bundle'
  
  # 是否是静态库,如果是静态库,需要设置该选项,默认为动态库
  s.static_framework = true
  # arc和mrc选项
  s.requires_arc = true
  
  # 当前 sdk 依赖的三方 .a 文件
  s.vendored_libraries = 'ASDK/Assets/xxx.a'
  # 当前 sdk 依赖的系统 .a 文件
  s.libraries ='c++'
  
  # 当前 sdk 依赖的三方 framework
  s.vendored_frameworks = 'ASDK/Assets/xxx.framework', 'ASDK/Assets/yyy.framework'
  # 当前 sdk 依赖的系统的 framework
  s.frameworks = 'AVFoundation', 'UIKit', 'Foundation', 'CallKit'
  
  # 要添加到最终专用 pod 目标 xcconfig 文件的任何标志
  s.pod_target_xcconfig = {
    'ENABLE_BITCODE' => 'NO',
    'OTHER_LDFLAGS' => '-ObjC',
    'LIBRARY_SEARCH_PATHS' => '/Users/xxx/Desktop/ASDK/Assets',
  }

  # 需要对外部暴露的头文件
  s.public_header_files = [
    'ASDK/Classes/ASDK.h',
    'ASDK/Classes/xxx.h',
    'ASDK/Classes/yyy.h',
  ]
  
  # 当前 podspec 类库对外部第三方库的依赖。
  # 如果使用 pod package 打包 sdk 时候,这里的 dependency 会被自动添加前缀,防止重复引用冲突。
  # 而且这里的依赖只能是 pod 库(公有或者私有)的内容.
  s.dependency 'AFNetworking/Serialization'
  s.dependency 'AFNetworking/Security'
  s.dependency 'AFNetworking/NSURLSession'
  s.dependency 'AFNetworking/Reachability'
  
end

3. 打包命令

进入项目目录,在终端输入以下命令进行打包:

$ pod package ASDK.podspec --exclude-deps --no-mangle --embedded

命令参数说明:

  • –force
    强制覆盖之前已经生成过的二进制库

  • –embedded
    生成静态.framework

  • –library
    生成静态.a

  • –dynamic
    生成动态.framework

  • –bundle-identifier
    动态.framework是需要签名的,所以只有生成动态库的时候需要这个BundleId

  • –exclude-deps
    不包含依赖的符号表,生成动态库的时候不能包含这个命令,动态库一定需要包含依赖的符号表。

  • –configuration
    表示生成的库是debug还是release,默认是release。–configuration=Debug

  • –no-mangle
    表示不使用name mangling技术,pod package默认是使用这个技术的。我们能在用pod package生成二进制库的时候会看到终端有输出Mangling symbols和Building mangled framework。表示使用了这个技术。

    如果你的pod库没有其他依赖的话,那么不使用这个命令也不会报错。但是如果有其他依赖,不使用–no-mangle这个命令的话,那么你在工程里使用生成的二进制库的时候就会报错:Undefined symbols for architecture x86_64。

  • –subspecs
    如果你的pod库有subspec,那么加上这个命名表示只给某个或几个subspec生成二进制库,–subspecs=subspec1,subspec2。生成的库的名字就是你podspec的名字,如果你想生成的库的名字跟subspec的名字一样,那么就需要修改podspec的名字。
    这个脚本就是批量生成subspec的二进制库,每一个subspec的库名就是podspecName+subspecName。

  • –spec-sources
    一些依赖的source,如果你有依赖是来自于私有库的,那就需要加上那个私有库的source,默认是cocoapods的Specs仓库。–spec-sources=private,https://github.com/CocoaPods/Specs.git。

 类似资料: