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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容