年前调研了关于组件化的一些实施方案,最终确定将项目进行分层和业务拆分成独立工程,为了便于管理,业务组件和业务库采用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