一、相关课题研究主题
- CocoaPods 对比 SwiftPackageManager 和 Carthage
- CocoaPods 架构解析
- CocoaPods 核心原理
- 创建 CocoaPods 本地库、公开库与私有库
- 为自己的开源项目添加 CocoaPods 支持
- CocoaPods 与 Swift 交互说明
- CocoaPods 常见错误分析与解决
- podfile 全面解析
- CocoaPos plugin 探究
- 1、探究 CocoaPods framework 与源码关系
- 2、CocoaPods Package 使用与原理
- 3、CocoaPods-generate 使用与原理
- 4、基于 CocoaPods 组件二进制化
- 5、组件化与 CI
- 实践:自定义 plugin 之调试二进制组件源码
- 实践:Flutter podhelper.rb 分析
二、名词解释
索引库:用来检索 clone 项目真正地址的一个代码仓库,分为公开索引库和私有索引库,公开索引库即 https://github.com/CocoaPods/Specs.git,只能接受开源框架。
命令:
pod repo:输出本地所有的索引库信息
pod repo push [索引库名称] [podspec文件名]:将 podspec 文件 push 到本地索引库,例如 pod repo push huayuerepos DRNetworkService.podspec --verbose --allow-warnings --sources=http://172.31.0.116/iOS/huayuerepos.git,https://github.com/CocoaPods/Specs.git --use-libraries
// 下面是辅助 pod 通过编译的一些命令参数
—allow-warnings // 忽略编译告警
—verbose // 输出详细的信息
—use-libraries // 使用静态库,如果私有库中存在.a文件,则必须加上这个参数。自定义了pod 私有库,同时引用了另一个私有库
—sources=xxxx,xxxxx // 引用的源码仓库地址,默认 github 源,多个源之间以英文逗号分隔;当自定义私有库相互依赖时,可以添加自定义的私有仓库源
--skip-tests: 在验证期间跳过构建和运行测试
--skip-import-validation: 跳过验证pod是否可以导入,即跳过链接步骤
pod spec create [filename]:创建 podspec 文件
pod spec lint --private:podspec 文件本地验证,等效于 pod lib lint
pod spec lint [filename]:podspec 文件远程验证
三、制作本地私有库
终端下输入 pod repo,如果之前没有创建过本地索引库,输出信息为:
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/Jack/.cocoapods/repos/master
浏览器打开 https://github.com/CocoaPods/Specs,可以看到一个 Specs 文件夹,文件夹内包含目前所有支持 CocoaPods 框架的索引,但 https://github.com/CocoaPods/Specs.git 是公开索引库,只能添加公开(开源)框架,如果想让私有框架支持 CocoaPods,这个时候必须用私有索引库。
1、已有开发好的框架代码,需要抽离成私有库
如果私有框架的代码已存在,只需进入对应私有框架的根目录,创建 podspec 文件,填写正确信息后上传,并将 podspec 文件 push 到本地私有索引库即可。
- pod spec create xxx // 创建 podspec 文件
- pod lib lint --private // podspec 文件本地验证
- pod spec lint xxx.podspec --allow-warnings // podspec 文件远程验证,忽略编译告警
- git add . // 添加 podspec 文件
- git commit -m xx // 提交 podspec 文件
- git push origin master // 将 podspec 文件推送至远程代码仓库
- pod repo push [本地私有索引库名称] [podspec文件名.podspec] // 将 podspec 文件 push 到本地索引库
- pod repo // 查看本地的索引库信息
- cd [需要 push 的索引库 path]
- git status // 查看第 7 步是否成功,如果没有成功,则看不到变更,此时需要检测哪里出了问题,并重新开始
- git add .
- git commit -m "xx"
- git push origin master // 将本地索引库的修改记录 push 至远程索引库
2、从 0 开始创建一个私有库
如果从 0 开始创建一个私有库,则按照以下步骤执行:(以下均以TestLib为例,请自行替换)
终端进入准备创建 lib 的文件夹,执行命令 pod lib create TestLib
这个过程可能需要等待几秒,之后会出现如下信息:
What language do you want to use?? [ Swift / ObjC ]
Would you like to include a demo application with your library? [ Yes / No ]
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Would you like to do view based testing? [ Yes / No ]
根据提示输入即可,完成后会自动打开 TestLib 对应的 Example 工程
执行 tree 命令查看目录结构
01:TestLib Jack$ tree TestLib -L 2
TestLib
├── Example
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ ├── TestLib
│ ├── TestLib.xcodeproj
│ ├── TestLib.xcworkspace
│ └── Tests
├── LICENSE
├── README.md
├── TestLib
│ ├── Assets
│ └── Classes
├── TestLib.podspec
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
10 directories, 5 files
将组件放入TestLib/Classes 中,并删除 ReplaceMe.m,进入 Example 文件夹执行 pod install 后,TestLib 对应的 Example 工程已经装载好,可以进行 demo 演示。以后每次更新 lib,都需要进到 Example 中执行 pod install 获取最新代码。
- 创建远程私有库
这里 README.md、开源许可证、gitignore 都不需要添加,从上面 TestLib 的目录结构可以看到,pod lib create 已经创建了这三个文件,如果添加,在 commit 时候会导致冲突(文件内容不完全相同),所以只要创建一个最干净的私有库。
Pod::Spec.new do |s|
s.name = 'TestLib'
s.version = '0.1.0'
s.summary = 'TestLib'
s.description = <<-DESC
TestLib只是一个演示
DESC
s.homepage = 'https://coding.net/u/coder_01/p/TestLib'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { '01_Jack' => '123@qq.com' }
s.source = { :git => 'git@git.coding.net:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'TestLib/Classes/**/*'
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# }
s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
- 对 podspec 进行本地验证,--sources 可以添加私有库地址,多个以逗号分隔:
pod lib lint --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'
如果因为 waring 验证不通过可以加上--allow-warnings,远程验证和 pod repo push 同理
- 对 podspec 进行远程验证
pod spec lint xx --allow-warnings
- 打包
验证通过后打包类库,这里可以用 cocoapods 的插件 cocoapods-packager 来完成。如果之前没有安装 cocoapods-packager,执行以下命令:
sudo gem install cocoapods-packager
打包:pod package TestLib.podspec --force
默认打包成.framework,如果加上 --library 则打包成.a。
验证通过后,通过 git status 可查看当前git改变状态,不需要提交的文件可添加到gitignore中。
git status
git add .
git commit -m 'first blood'
到这里已经可以将代码提交到远程仓库,但需要先添加仓库地址再提交
- 上传
git remote add origin [git@git.coding.net](mailto:git@git.coding.net):coder_01/TestLib.git
git push origin master
在对 podspec 做远程验证前要先 push tag,tag 必须与 podspec 中的 version 一致
git tag 0.1.0
git push --tags
pod spec lint --private
远程验证通过后,将 TestLib.podspec push 到远程私有索引库,同样,需要先添加仓库再push
- 创建私有索引库
pod repo add PrivateSpecs [git@git.coding.net](mailto:git@git.coding.net):coder_01/PrivateSpecs.git
pod repo push PrivateSpecs TestLib.podspec
查看索引库
pod repo
此时本地索引库长这样
cd ~/.cocoapods/repos
open .
PrivateSpecs
最基本的制作到这里就完成了,现在能搜到 TestLib 这个库
pod search TestLib
pod search
新建工程,pod init,修改 podfile 文件。这里需要添加两个 source,一个原 master repo,一个后添加的 PrivateSpecs
source '[git@git.coding.net](mailto:git@git.coding.net):coder_01/PrivateSpecs.git'
source '[https://github.com/CocoaPods/Specs.git](https://github.com/CocoaPods/Specs.git)'
use_frameworks!
target 'Test' do
pod 'TestLib'
end
执行 pod install 即可使用 TestLib 框架
Tip:如果组件中含有图片、音视频、xib/storyboard等,podspec的描述与代码中的写法都需要改变
四、常见问题
1、pod repo push / pod lib lint i386 x86_64 验证不通过 (Cocoapods 校验逻辑 https://xiaozhuanlan.com/topic/5869024173)
产生背景:在制作私有库的时候,依赖了某 SDK,该 SDK 只能在真机编译,即只支持真机指令集,不支持模拟器指令集
pod repo push / pod lib lint 验证的时候,会验证模拟器指令集(i386、x86_64)
解决方案:跳过对模拟器指令集的验证 --skip-import-validation