iOS项目架构之拆分基础组件

创建远程索引库

每创建一个组件都会带有一个 xxx.podspec 的索引文件。专门用来存放这些索引文件的库就叫做索引库。我们需要将这些索引文件上传到远程索引库才能保证其他的同事能够拿来用。

我们在 gitlab 上创建一个仓库作为远程索引库,因为是公司项目,所以需要创建 private 私有索引库。

创建本地索引库

通过 pod repo 查看本地当前索引库,如果之前没有创建过,应该只有一个 master。

1
2
3
4
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/xxx/.cocoapods/repos/master

pod repo add VPTSpecs http://git.vphotos.cn/XiaXianBing/Specs.git
通过 pod repo add <本地索引库的名字> <远程索引库的地址>,创建本地索引库并和远程索引库做关联(本地索引库的名字建议和远程索引库起的名字一样)。

再次查看,查看本地当前索引库,就会发现本地已经有了该索引库,同时可以看到该本地索引库的物理地址为: /Users/xxx/.cocoapods/repos/Specs

1
2
3
4
5
6
7
8
9
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/xxx/.cocoapods/repos/master

Specs
- Type: git (master)
- URL: http://xxx.com/xxx/Specs.git
- Path: /Users/xxx/.cocoapods/repos/Specs

创建远程代码库

创建远程代码库的方式和创建远程索引库的方式一样,我们创建一个名为 MXTObjcKit 的远程代码库,用来存放基础组件的代码。

创建本地代码库

创建名为 MXTObjcKit 的本地模版库,执行 pod lib create MXTObjcKit,这期间会出现一些参数设置,只需要配置一下就好。你也可以执行 pod lib create MXTObjcKit --template-url=https://github.com/CocoaPods/pod-template.git 将会使用默认参数配置。

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Cloning `https://github.com/CocoaPods/pod-template.git` into `MXTObjcKit`.
Configuring MXTObjcKit template.

------------------------------

To get you started we need to ask a few questions, this should only take a minute.

If this is your first time we recommend running through with the guide:
- http://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and double click links to open in a browser. )


What platform do you want to use?? [ iOS / macOS ]
> iOS

What language do you want to use?? [ Swift / ObjC ]
> Objc

Would you like to include a demo application with your library? [ Yes / No ]
> Yes

Which testing frameworks will you use? [ Specta / Kiwi / None ]
> Kiwi

Would you like to do view based testing? [ Yes / No ]
> Yes

What is your class prefix?
> MXT

Running pod install on your new library.

Analyzing dependencies
Fetching podspec for `MXTObjcKit` from `../`
Downloading dependencies
Installing FBSnapshotTestCase (2.1.4)
Installing Kiwi (3.0.0)
Installing MXTObjcKit (0.1.0)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `MXTObjcKit.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There are 3 dependencies from the Podfile and 3 total pods installed.

[!] Automatically assigning platform `ios` with version `9.3` on target `MXTObjcKit_Example` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.

Ace! you're ready to go!
We will start you off by opening your project in Xcode
open 'MXTObjcKit/Example/MXTObjcKit.xcworkspace'

To learn more about the template see `https://github.com/CocoaPods/pod-template.git`.
To learn more about creating a new pod, see `http://guides.cocoapods.org/making/making-a-cocoapod`.

如果执行 pod lib create xxx 报以下错误:

1
2
3
4
5
6
7
8
9
10
11
Traceback (most recent call last):
6: from ./configure:4:in `<main>'
5: from ./configure:4:in `each'
4: from ./configure:5:in `block in <main>'
3: from ./configure:5:in `require_relative'
2: from /Users/xiaxb/Documents/VPhoto/MXTObjcKit/setup/ProjectManipulator.rb:1:in `<top (required)>'
1: from /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- xcodeproj (LoadError)

To learn more about the template see `https://github.com/CocoaPods/pod-template.git`.
To learn more about creating a new pod, see `http://guides.cocoapods.org/making/making-a-cocoapod`.

说明是没有安装 xcodeprojxcodeproj 安装错误导致的,需要先安装 xcodeproj 执行:

1
2
sudo gem uninstall xcodeproj
sudo gem install xcodeproj

实现并集成组件

现在组件还没有添加任何内容,我们先来实现这个空组件,之后再慢慢往里添加内容。我们先编译运行组件 Example 项目和单元测试看是否报错。

编译运行通过后,修改 podspecs 索引文件。主要需要修改的地方有:版本号、项目的简单概述和详细描述、homepage、source。再根据版本号打tag并将本地组件代码库提交到远程代码库。

1
2
3
4
5
6
$ git add .
$ git commit -m "xxx"
$ git remote add origin 远程代码仓库地址
$ git push origin master
$ git tag 版本号 (注:这里的版本号必须和podspec里写的版本号一致)
$ git push --tags

验证索引文件

这里有两种方式验证索引文件:
1、pod lib lint 是只在本地索引库验证,
2、pod spec lint 是从本地和远程索引库验证。

我一般的流程是先执行 pod lib lint 验证本地索引库。 验证成功做后再将代码提交到远程代码库并打好tag,再执行 pod spec lint 验证远程索引库。都验证通过后再通过 pod repo push Specs 提交到远程索引仓库。

无论是本地验证还是远程验证和提交索引仓库命令都可以添加附加参数:
--verbose: 查看详情
--use-libraries: 如果依赖中,有静态库,验证时可以设置使用静态库。
--allow-warnings: 忽略警告
--sources=https://github.com/CocoaPods/Specs.git,http://x.x.x.x:8090/XiaXianBing/Specs.git:添加私有索引库

因为默认只会检查 master 索引库,即:https://github.com/CocoaPods/Specs.git,如果有依赖私有库,则后面添加上自己的私有索引库即可。

例如:

1
2
3
$ pod lib lint --verbose --use-libraries --allow-warnings
$ pod spec lint --verbose --use-libraries --allow-warnings
$ pod repo push Specs --verbose --use-libraries --allow-warnings

完成之后在组件远程代码库中就能看到这个组件的tag了。接下来在已有项目中集成该基础组件。

错误提示: 如果在 push Specs 时,报以下错误:

1
[!] The repo `Specs` at `../../../.cocoapods/repos/Specs` is not clean

可先执行 pod repo update Specs, 将索引库更新再提交。

新版本中,在生成Cocoapods时,spec.resources 下不能放 Assets 文件,否则提交不了。

在主工程修改 Podfile 文件, 把 MXTObjcKit 组件 pod 进来。(注:需要在Podfile中指定组件远程索引库地址,如果不指定默认会从 master 的索引库查找就会报找不到组件)

1
2
3
4
source 'https://github.com/CocoaPods/Specs.git'
source 'http://xxx.com/xxx/Specs.git'

pod 'MXTObjcKit', '0.0.1'

好了,在主工程文件夹下执行 pod install,这个空的基础组件 MXTObjcKit 就被主工程引用了。

拆分基础组件

以上我们只是创建了一个空的基础组件,主工程引用时也是无任何功能,现在开始我们将主工程中的一些基础类拆分到基础组件里。

1
2
3
4
s.source_files = "MXTObjcKit/Classes/**/*.{h,m}"
s.public_header_files = "MXTObjcKit/Classes/**/*.h"
s.resources = ["MXTObjcKit/Classes/**/*.xib"]
s.resource_bundle = { 'MXTObjcKit' => ['MXTObjcKit/Resource/*.lproj', 'MXTObjcKit/Resource/*.png'] }

之后只需在/MXTObjcKit/Resource/、/MXTObjcKit/Classes/文件夹下引入资源和代码,运行 Example 和单元测试完成,就可以提交到远程代码库,打上一个新tag,在其它工程里就能使用这个通用的基础组件了。


坚持原创技术分享,您的支持将鼓励我继续创作!
----------- 本文结束, 感谢您的阅读 -----------