ios-pod-package

了解 pod lib 命令的用法。

创建Pod库

第一步,创建Pod工程。使用 pod lib create 命令创建Pod工程。

1
pod lib create <PodName>

按提示配置选项,完成后自动打开 pod install 并打开 xcworkspace 文件

第二步,生成 Framework。Xcode中运行Example工程后,会生成对应的Framework文件

不过这种方式生成Framework文件有几个问题:

  • 兼容性问题 - 生成的Framework只支持模拟器或真机,不能同时二者同时兼容
  • 自动化问题 - 手动在Xcode操作,不便于自动构建

生成Framework

使用 cocoapods-packager 生成

CocoaPods Packager 是一个 CocoaPods 插件,用于从 podspec 生成静态库。

CocoaPods plugin which allows you to generate a static library from a podspec.

安装

一种方式是使用 gem install 安装。

1
$ gem install cocoapods-packager

不过从 Gem 官方源安装的 cocoapods-packager 版本比较老。

1
2
$ gem list | grep packager
cocoapods-packager (1.5.0)

另一种方式是从源码安装。

  • 下载源码
  • 修改版本号
  • 安装依赖库
  • 构建gem安装包
  • 安装gem包
1
2
3
4
5
6
7
8
9
git clone https://github.com/CocoaPods/cocoapods-packager.git

# 修改 lib/cocoapods_packager.rb 文件中的版本号

bundler install

sudo gem build cocoapods-packager.gemspec

sudo gem install cocoapods-packager-1.6.0.gem -l

构建安装包。构建成功后生成一个 gem 安装包

安装gem包。使用 sudo gem install <gem包名> 安装。

检查版本号。安装完成后,使用 gem list | grep packager 检查 cocoapods-packager 版本是否正确

使用

使用cocoapods-packager时遇到几个问题,记录如下。

问题一:没有使用 CDN

pod package 命令默认的 spec-sources 是 https://github.com/CocoaPods/Specs.git,所以会长时间卡在 Cloning spec repo 这一步。

解决办法是指定 spec-sources。参考

1
pod package PodDemo.podspec  --spec-sources='https://cdn.cocoapods.org/'

问题二:XCode 12 生成失败

错误日志

1
have the same architectures (arm64) and can't be in the same fat output file
  • issues/259 - have the same architectures (arm64) and can’t be in the same fat output file
  • issues/260 - Xcode12.0.1 build failed, can’t generate framework #260

解决办法是排除特定的架构,避免打包失败。这个办法由issues/259提供,我尝试发现在我的机器上可用。

首先,找到 /Library/Ruby/Gems/2.6.0/gems/cocoapods-packager-1.5.0/lib/cocoapods-packager/pod_utils.rb 文件。

然后,在该文件第32行后面添加一行。

1
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'

不过这个解决方案并没有提到问题的原因。推测这里的问题跟 Carthage Xcode 12 上的打包问题比较类似。Carthage 对此的解释是:

Well, shortly, Carthage builds fat frameworks, which means that the framework contains binaries for all supported architectures. Until Apple Silicon was introduced it all worked just fine, but now there is a conflict as there are duplicate architectures (arm64 for devices and arm64 for simulator). This means that Carthage cannot link architecture specific frameworks to a single fat framework.

You can find more info in respective issue #3019.

问题三:找不到头文件

遇到一个很诡异的问题:生成的 Framework 中没有公开的头文件。

排查了很久,发现是一个非常低级的错误。

原因是这样的:我使用本地Git仓库中的代码来生成 Framework,所以指定了目录但没有指定tag。在没有指定tag时,cocoapods-packager 使用 HEAD 指向的代码来打包。但是,我的代码写好了(包括头文件和源文件),但并没有提交到Git仓库!cocoapods-packager 当然无法复制公开的文件到生成的 Framework 中。

1
2
#s.source           = { :git => 'https://github.com/abc/CmLib2.git', :tag => s.version.to_s }
s.source = { :git => '/Users/abc/PublicCode/CmLib2'}

使用 Carthage 生成

Carthage用于生成二进制的Framework。对比CocoaPods,Carthage无入侵性。

Carthage is intended to be the simplest way to add frameworks to your Cocoa application.

Carthage builds your dependencies and provides you with binary frameworks, but you retain full control over your project structure and setup. Carthage does not automatically modify your project files or your build settings.

需要注意的是 Carthage只支持

参考

cocoapods-packager源码安装 - 简书