组件化

年前调研了关于组件化的一些实施方案,最终确定将项目进行分层和业务拆分成独立工程,为了便于管理,业务组件和业务库采用CocoaPods做依赖管理。因为是私有的代码,所以一定不希望别人都可以搜索到,那第一步就是建立自己的私有仓库,即私有spec repo。

Spec Repo

所谓Spec Repo,就是Pods的索引。一旦在podfile中设置source为某个私有repo的git地址,在进行pod update的时候就会去这个repo中进行检索,如果检索到对应的pod,会读取该Pod的podspec从而进行安装。建立私有repo很简单,首先在gitlab创建一个仓库


复制git地址,然后在本地终端执行以下命令,

pod repo add EthercapPrivateSpechttp://git.ethercap.com/mobile-componentization/EthercapPrivateSpec.git

add后面代表私有库索引的名称,可以和git仓库的名称不同,这里为了方便,我取了一样的名字。执行成功之后,可以在cocoapods目录下看到自己的spec文件夹


这里提以下,repos里面的master文件夹,就是cocoapods的主索引,平时我们使用的SDWebImage,AFNetworking都是从这里进行的搜索和匹配

创建私有仓库

建立好私有索引后,就可以继续下一步,创建自己的私有仓库,这里我以网络基础库为例子,首先在目标文件夹下,执行以下命令

创建cocoapods工程

pod lib create EthercapNetworkLibrary

之后,cocoapods会自动下载工程模板,完成后,会问几个关于配置的问题,语言种类、是否需要测试demo、测试框架等


这里我选择OC作为开发语言,包含测试demo,这样就不用新建一个测试工程,节省一些步骤,全部填写后,会自动打开cocoapods帮你建立好的模板工程,目录结构如下



需要注意的是,和平时开发有所不同,现在我们的开发都应该在Pod工程下进行,在Classes文件夹下添加需要的类,开发完成后,在demo工程中写测试代码,就可以直接运行和测试了,非常方便,这里就不在赘述。

编写Spec文件

想要建立私有库,还有一个文件非常重要,就是podspec,工程的索引文件,打开文件,删除掉无用注释,键入以下内容

编写Spec文件

Pod::Spec.newdo|s|

s.name         ="EthercapNetworkLibrary"

s.version      ="0.0.2"

s.summary      ="EthercapNetworkLibrary."

s.description  = <<-DESC

this is EthercapNetworkLibrary

DESC

s.homepage     ="http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary"

s.license      = {:type=>"MIT",:file=>"FILE_LICENSE"}

s.author             = {"Muqiushi"=>"Muqiushi@ethercap.com"}

s.platform     =:ios,"8.0"

s.source       = {:git=>"http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary.git",:tag=> s.version.to_s }

s.subspec'AFNetworking'do|network|

network.source_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/AFNetworking/*.{h,m}"

network.public_header_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/AFNetworking/*.h"

network.frameworks ="SystemConfiguration","CoreTelephony"

network.library ="resolv"

network.ios.vendored_frameworks ="EthercapNetworkLibrary/Frameworks/AlicloudHttpDNS.framework","EthercapNetworkLibrary/Frameworks/AlicloudUtils.framework","EthercapNetworkLibrary/Frameworks/UTDID.framework"

end

s.subspec'UIKit+AFNetworking'do|networkui|

networkui.source_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/UIKit+AFNetworking/*.{h,m}"

networkui.public_header_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/UIKit+AFNetworking/*.h"

networkui.dependency"EthercapNetworkLibrary/AFNetworking"

end

end

解释以下里面的几个主要内容

name:pod search时提供给别人的检索名字

version:工程版本号,一般是和tag相对应

source::git 工程的git地址,:tag工程的标签版本

source_file: 上传到远端的本地文件路径,在这些路径下的文件才会被打包

frameworks: 工程用到的系统framework名字

library:工程用到的系统library,注意,这里需要去掉前面的lib前缀

vendored_frameworks:工程中使用的第三方framework,需要加入路径

更多属性可以参照官网教程来写,Podspec Syntax Reference

上传到私有Spec Repo

开发完成并编辑好spec文件后,就可以进行上传,以便让别人可以通过pod方式引入我们的工程。在上传之前,首先要检验本地spec文件的有效性,是否存在错误和引用依赖是否完备,在工程根目录下执行以下命令

本地检查Spec文件合法性

pod lib lint

有错误的话按照提示修改spec文件,成功的话会提示:

EthercapNetworkLibrary passed validation.

接下来远程检查pods,这次cocoapods会根据podspec文件里的source 检查对应的仓库里有没有指定tag的仓库。显然我们还没有将tag上传到github的仓库里,可定会报错,执行试一下

远程检查Spec合法性

pod spec lint

-> EthercapNetworkLibrary (0.0.2)

- WARN  | description: The description is shorter than the summary.

- ERROR | [iOS] unknown: Encountered an unknown error ([!] /Applications/Xcode.app/Contents/Developer/usr/bin/git clone http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary.git /var/folders/6x/8pyfnj_n4573cq4206yjz41c0000gn/T/d20161017-14130-148x77b --template= --single-branch --depth 1 --branch 1.0

Cloning into'/var/folders/6x/8pyfnj_n4573cq4206yjz41c0000gn/T/d20161017-14130-148x77b'...

fatal: Remote branch0.0.2not found in upstream origin

) during validation.

Analyzed1podspec.

[!] The spec did not pass validation, due to1error and1warning.

提示0.0.2没有找到,所以先把工程上传,打tag,注意tag名一定要是0.0.2,和spec中相同,具体git操作自行解决。

之后再次执行

pod spec lint

提示EthercapNetworkLibrary passed validation.说明检测通过

最后执行一下命令,将spec文件上传到spec repo中

pod repo push EthercapPrivateSpec EthercapNetworkLibrary.podspec

上传成功后,可以在仓库中看到你的spec文件


至此,我们的工程就可以和AFNetworking一样,通过pod被别人引用,尝试执行一下pod search EthercapNetworkLibrary


over

推荐阅读更多精彩内容