Home Cocoapods管理组件实际操作演示
Post
Cancel

Cocoapods管理组件实际操作演示

目前我们的项目工程使用cocoapods 来管理依赖,同时我们对项目进行组件化的时候,cocoapods也是必要的组件生命周期管理工具。


名词解释

  • 公共索引库 / 远程索引库

  • 组件工程库 / 组件库

    • Readme文档
    • Example工程,内含外部需要用到的接口的使用例子(或者注释足够清晰)的
    • 组件代码
  • 本地索引库

    • 截图
  • 组件工程
    • Example 目录
    • 组件代码
    • 组件的xxx.podspec文件
  • spec文件/podspec文件

  • 壳工程

步骤归纳

创建和编写

  1. 创建 远程索引库远程私有库

    • 一般来说,你开发的组件不会涉及到初创索引库,也就是你们的公共索引库是已经存在的,目前我们的组件索引库名字是example-app-ios-modules-ykspecs,对应的repo地址是http://gitlab.example.com/App/iOS/Modules/YKSpecs.git
  2. 远程索引库 添加到本地 pod repo add [索引库名称] [索引库地址]
    1. 这一步骤会在 /Users/[username]/.cocoapods/repos下拉取远程索引库到本地

    2. 这个目录以下称之为 本地索引库
    3. 你这是索引库名称单独为本地索引库命名了
  3. 为在本地(任意目录)创建一个 pod模板库pod lib create [组件名],用此工程来为组件添加代码,并且利用Example工程进行测试

    • 组件名一般YKXxxxxModule或者YKXxxxxComponent

    • 主要关注 Example组件代码文件夹 以及 xxx.podspec文件
    • 截图描述文件夹目录
  4. 将需要组件化的代码添加到模板库的Classes目录下

    • 截图描述 新建文件并添加到组件文件目录
  5. 修改spec描述文件
    1. s.version,这个是最常改动的字段,需要结合整个工程的tag
    2. s.source 组件工程的repo地址
    3. s.source_files 在组件工程中,组件代码的文件目录
  6. 更新Readme 添加 Change Log

测试

  1. 基于组件Example工程的测试
    • 你添加到Classes目录下的文件并不能在Example的类中以<xxx/xx.h>的形式引用,需要在Example目录先执行pod install

上传

保存你的工程修改,并推送到组件工程库

1
2
3
4
5
6
git add .
git commit -m "提交描述"
git remote add origin 远程私有库地址
git push origin master
git tag '0.1.0'
git push --tags

提交xxx.podspec至私有公共索引库

  • 验证xxx.podspec
1
2
3
pod lib lint //本地lib验证验证源代码的编译

pod spec lint //远程spec验证 验证spec文件中的各项内容资源是否合规和可访问

具体操作:提交 xxx.podspec 到私有库

1
pod repo push [本地索引库名字]   [组件名].podspec
1
pod repo push example-app-ios-modules-ykspecs YKTomTestKit.podspec --allow-warnings

使用

1
2
3
4
source 官方索引库url
source 私有索引库url
pod '[组件名称]'
pod install

具体流程演示

创建远程私有索引库和私有代码仓库

  1. spec repository是索引仓库,所有的配置按照包名、版本号分门别类的存放在这个仓库。这个仓库只用来存放spec文件,用来索引,目前我们内部只有唯一的索引库,无须创建
  2. code repository是代码仓库,我们把包代码上传到这个仓库。

这里以 gitlab为例创建 code repository

  • 创建组件工程库的截图

将远程索引库添加到本地

将第一步中创建的spec repository添加到本地索引库

1
2
// pod repo add 索引库名称 索引库地址
pod repo add YKSpecs http://gitlab.example.com/App/iOS/Modules/YKSpecs.git

查看本地所有的索引库

1
pod repo list
  • pod repo list 截图

创建组件工程– 使用cocoapods模板库

cd到你平时的工作目录 ,执行创建命令

1
2
// pod lib create 组件名
pod lib create YKTomTestKit

执行后会需要配置一些信息,直接按下图配置即可

  • 创建过程的截图

这里会询问几个问题(答案根据实际情况设置),分别是:

1、语言选择 - ObjC
2、是不是需要一个demo项目工程  - Yes
3、测试框架使用哪一个  - None
4、是不是需要做基本的测试 - No
5、类前缀是什么 -  YK

添加组件代码

创建完成后会自动帮我们打开相应的Example项目,模板文件目录中会出现如图这些文件,我们把基础组件相关的东西丢到Classes文件夹中,并且把ReplaceMe.m文件删除

截图:

  • 创建组件代码文件
  • 选择目录
  • 编写组件代码文件代码

默认Classes文件夹中存放的文件就是pod install时要下载下来的文件,当然可以通过修改spec文件的配置来更改位置

修改Spec描述文件

spec配置文件目录地址

配置说明如下,根据需要修改配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Pod::Spec.new do |s|
  s.name             = '框架名字,pod search "框架名"就是搜的这个'
  s.version          = '框架版本号1.0.0, 这里跟下面s.source中的tag有关'
  s.summary          = '框架简介'

  s.description      = "这个是详细描述,这里需要注意的是,这里文字的长度需要比  
  s.suYKTomTestKitmmary的要长,不然会出现警告"
                       
  s.homepage         = '仓库首页地址(例:http://git.vanke.com)'
  s.license          = '框架遵守的开源协议'
  s.author           = '框架的作者'
  s.source           = '框架的资源路径'

  s.ios.deployment_target = '框架支持的最低平台版本'

  s.source_files = '框架被其他工程引入时,会导入所填文件目录下的.h和.m文件'
  
  # s.resource_bundles = {
  #   'YKTomTestKit' => ['YKTomTestKit/Assets/*.png']
  # }

  # s.public_header_files = '框架公开的头文件'
  # s.frameworks = '框架依赖的framework'
  s.dependency '框架依赖的其他第三方库
end

安装与测试本地库

在Example项目的Podfile文件中可以看到

1
pod 'YKTomTestKit', :path => '../'

模板库已经默认帮我们在Podfile中指定了YKTomTestKit.podspec的位置,使组件YKTomTestKit可以正常安装使用和方便测试,

1
pod install

执行之后组件代码会集成到项目中,如上图所示,测试一下确保组件可用。

上传代码

将代码(含Example和组件代码)提交到组件仓库

1
2
3
4
5
6
git add .
git commit -m 'firstCommit'
git remote add origin http://[email protected]/plugins/weexPlugins/iOS/YKTomTestKit.git
// 第一次push如果报错的话可以加上-f
// git push -f origin master
git push origin master

打标签

tag的版本0.1.0spec中的s.version保持一致

1
2
git tag '0.1.0'
git push --tags

tag的 删除

1
2
3
4
5
6
7
8
git tag -d 标签名  

例如:git tag -d 0.1.0

git push origin :refs/tags/标签名  

例如:git push origin :refs/tags/0.1.0

提交podspec到私有索引库

在上传spec文件前我们可以做一个验证来节省时间,防止配置文件错误导致 push失败。

验证spec

本地验证

1
2
3
4
// 本地验证不会验证 s.source 中的tag
//验证结果显示 ++工程名 passed validation++说明验证成功。
pod lib lint
pod lib lint --allow-warnings

远程验证

1
2
3
4
5
6
// 远程验证会验证 s.source
//验证结果显示 ++工程名.podspec passed validation++说明验证成功。
中的tag,如果此时没有打上相应的标签则会报错

pod spec lint
pod spec lint --allow-warnings --use-libraries

验证可能失败的原因

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 如果有警告,会导致无法通过,需要添加  --allow-warnings
2. 如果使用了c函数相关的,需要添加  --use-libraries
3. 如果依赖了私有库,需要添加库的源  --sources='https://xxxx'
根据出现的问题添加命令:
pod lib lint --sources='https://xxxx' --use-libraries --allow-warnings
pod spec lint --sources='https://xxxx' --use-libraries --allow-warnings

如果有推到多个索引库地址,逗号隔开,如下:
pod repo push vanke-liuh44-mccspecs --sources='https://github.com/CocoaPods/Specs.git','https://github.com/aliyun/aliyun-specs.git' --use-libraries --allow-warnings

4. 使用了不支持i386架构的库,验证不通过
    在podspec文件中添加只编译64位系统命令:
# 新版极光推送SDK不支持i386, 需加下面这条命令只编译编译64位的系统,否则本地验证不通过
  s.pod_target_xcconfig = {
      'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
  }

提交 podspec

1
2
// pod repo push 私有索引库名称 spec名称.podspec 
pod repo push example-app-ios-modules-ykspecs YKTomTestKit.podspec 

提交失败可能的原因

1
2
3
4
5
6
1. 如果有警告,会导致无法通过,需要添加--allow-warnings
2. 如果使用了c函数相关的,需要添加--use-libraries

根据问题添加命令

pod repo push example-app-ios-modules-ykspecs YKTomTestKit.podspec --use-libraries --allow-warnings

这里的操作过程是:先将我们的spec文件 push远程索引库,随后会拉取新的远程索引库本地索引库

成功之后可以测试搜索上传的组件

1
pod search '组件名'

使用私有库

podfile文件设置

1
2
3
4
5
6
7
8
//添加远程私有索引库地址
source 'http://git.vanke.com/liuh44/MccSpecs.git'
//官方索引库地址
source 'https://github.com/CocoaPods/Specs.git'

...
//添加使用组件
pod 'YKTomTestKit'

会去远程组件工程库寻找组件代码进行集成

1
 s.source_files = 'YKTomTestKit/Classes/**/*'

以上描述的就是我们的组件工程中的组件代码目录

执行 pod install

  • pod install 只会更新 podfile新增的库
  • pod repo update 会更新本地索引库
  • pod update <组件名> 更新podfile中依赖的组件
  • pod repo update example-app-ios-modules-ykspecs 只更新我们的私有库的索引库
    • 然后再 pod update YKTomTestKit ,更新指定的组件

常见问题和解决方案

过程中要注意的Tips

关于发布

  • 你可以随意的 commit & push整个工程,但是只能在发布的时候打Tag
  • cocoapods 1.8 之后使用cdn版本的源
This post is licensed under CC BY 4.0 by the author.

如何使用Cocoapods管理组件

最优解是奋斗逼