组件化

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容