CocoaPods 相关课题研究和本地库制作

一、相关课题研究主题

  • 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

浏览器打开 https://github.com/CocoaPods/Specs,可以看到一个 Specs 文件夹,文件夹内包含目前所有支持 CocoaPods 框架的索引,但 https://github.com/CocoaPods/Specs.git 是公开索引库,只能添加公开(开源)框架,如果想让私有框架支持 CocoaPods,这个时候必须用私有索引库。

1、已有开发好的框架代码,需要抽离成私有库

如果私有框架的代码已存在,只需进入对应私有框架的根目录,创建 podspec 文件,填写正确信息后上传,并将 podspec 文件 push 到本地私有索引库即可。

  1. pod spec create xxx // 创建 podspec 文件
  2. pod lib lint --private // podspec 文件本地验证
  3. pod spec lint xxx.podspec --allow-warnings // podspec 文件远程验证,忽略编译告警
  4. git add . // 添加 podspec 文件
  5. git commit -m xx // 提交 podspec 文件
  6. git push origin master // 将 podspec 文件推送至远程代码仓库
  7. pod repo push [本地私有索引库名称] [podspec文件名.podspec] // 将 podspec 文件 push 到本地索引库
  8. pod repo // 查看本地的索引库信息
  9. cd [需要 push 的索引库 path]
  10. git status // 查看第 7 步是否成功,如果没有成功,则看不到变更,此时需要检测哪里出了问题,并重新开始
  11. git add .
  12. git commit -m "xx"
  13. 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容