iOS代码组件化--pods创建私有库

前言

2016年开始使用组件化项目,但是一直没有整理创建私有库的流程了,直到隔了很久自己在创建私有库的时候又遇到了一些坑,就有整理一份文档的想法了。众所周知,Cocoapods是一个程序依赖工具,使用Cocoapods可以节省设置和更新第三方开源库的时间,当然也可以利用Cocoapods来管理我们的私有库。
组件化的第一步就是创建自己的仓库,若是公司的项目可以用gitlab。

1、创建远程索引库

我使用的是coding,大家也可以使用github、码云等等
创建一个私有仓库名称为TestSpec。

2、创建本地索引库

1、创建本地私有索引库Spec Repo
如果之前已经有私有spec repo,无需再创建,若没有需要创建一个私有的spec repo
使用命令:pod repo add <本地索引库名称> <远程索引库地址> 如:pod repo add TestSpec https://e.coding.net/wojia/testdemo/TestSpec.git
创建之后,可以查看下本地是否已创建成功:pod repo list

TOpos podropo.png

正常情况下会有一个公有的CocoaPods官方的master repo 和你的 私有库spec repo,可以通过~/.cocoapods/repos目录看到它们在本地的存放路径。

3、创建远程代码仓库

远程代码仓库是用来管理某一个组件的代码仓库,它和索引库不是同一个仓库。这个远程代码仓库可以是svn、码云、git。和创建索引库流程一样创建一个代码仓库。我这边创建的是一个TestLib代码仓库。

4、创建本地代码库

这个就是某个组件的本地代码库,在想要创建的目录文件夹下创建pod私有库。
1、在该目录下使用命令:pod lib create TestLib


image.png

之后会出现几个问题,按照提示
选择使用平台
选语言 swift/OC
选择是否生成一个demo
选择测试框架 Specta/Kiwi/None
选择是否做基于View的测试
确定一个文件前缀
2、成功之后会自动打开一个刚刚创建的工程,编译一下,成功。
我们用finder打开工程目录,进入 TestLib -> Classes ->
把自己的组件代码拷贝一份过来,并删除 ReplaceMe.m。然后进入Example文件夹执行pod update命令,再打开项目工程可以看到,刚刚添加的TestLib文件已经在Pods子工程下的Development Pods/TestLib中了。
3、cd 到 Example目录下, pod install 一下,把刚才拖入到 classes 里的文件pod进来。因为podfile里面默认会导入classes里的文件。查看无误后需要将该项目添加并推送到远端仓库,并编辑修改 TestLib.podspec 文件里面配置项s.homepage、s.source、s.source_files


image.png

Cocoapods创建出来的目录本身就在本地的Git管理下,我们需要做的就是给它添加远端仓库,同样去GitHub或其他的Git服务提供商那里创建一个私有的仓库(事先已创建)
4、检查无误后就可以提交代码,并打tag。首先进入刚才创建的仓库,即要上传代码的目录
cd TestLib

执行git命令,此命令会在当前目录下创建一个.git文件夹
git init
将项目的所有文件添加到仓库中
git add .
将add的文件commit到仓库
git commit -m 'init com'
将本地的仓库关联到gitlab上
git remote add origin <远程代码块地址>
上传代码到远程仓库
git push origin master 或者 git push -u origin master(第一次提交用)
git tag <版本号> | git tag −a 版本号−m '𝑣𝑒𝑟𝑠𝑖𝑜𝑛版本号'这里的版本号必须和podsepc文件里的一致。
git tag 验证版本号是否提交成功
$git push --tags


image.png

image.png

5、编辑podspec文件
上传完工程后就可以开始编辑podspec文件了,这里是TestLib.podspec文件,它是一个Ruby文件,用SubLime打开它,把编辑格式改成Ruby就能看到语法高亮了,原始的podspec文件已经有很多内容了,其中以#开头的都是被注释掉的部分,看起来应该像下图所示:
image.png

下面是编辑完成后的podspec文件,每个配置项后面都添加上了注释:
编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何warning或者error都是不可以的,它就不能被添加到Spec Repo中。验证需要执行以下命令:
有两种验证方式:
本地验证:pod lib lint your_podName.podspec 是检索本地文件
联网验证:pod spec lint your_podName.podspec 是本地和远程库提示检索
image.png

当你看到
image.png

image.png

表示验证通过了,不过这只是说明这个podspec文件是合格的,验证的时候也出现过错误,如下:
image.png

是因为远程仓库虽然创建了,但是没有初始化,初始化之后重新验证就可以验证通过。
验证通过了,不过最好还是在本地项目调用再验证下,验证podspec文件的正确性后,可以在本地先进行一次安装,没问题后再推送到仓库,修改podfile,指定podspec地址为本地的地址:
pod 'TestLib', :podspec => '/Users/admin/Desktop/TestProject/TestLib/TestLib.podspec'
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/Test中,这是因为我们是在本地测试,并没有把podspec文件添加到spec repo。

6、向Spec Repo提交podspec
pod repo push TestSpec TestLib.podspec --allow-warnings
前面是本地Repo名字(就是本地代码仓库文件夹名称) 后面是podspec名字 (spec的名称)

同样的加上上面验证时使用到的可选参数

image.png

7、私有组件库制作完成后,可以使用pod search命令验证一下
pod search TestLib


image.png

TostLib (e.1.6).png

8、在其他项目如何使用:新建一个工程
在Podfile 文件里做引用,然后pod install即可,不要忘记把 自己的索引库 添加到source 配置项里


image.png

9、swift私有库和oc私有库创建方式一样,区别在于外面工程要用的私有库里面的类或者属性需要使用public或者open修饰,否则外界就会找不到这个类或者属性cannot find type 'xxxx' in scope
10、需要注意私有库里面图片的使用需要通过bundle获取,如下使用方式 func getImageByName(imageName: String) -> UIImage? {
var scaleStr = ""
if UIScreen.main.scale == 1 {
scaleStr = ""

} else if UIScreen.main.scale == 2 {
scaleStr = "@2x"
} else if UIScreen.main.scale == 3 {
scaleStr = "@3x"
}
let newImageName = imageName + scaleStr
let imgPath = myBundle()?.path(forResource: newImageName, ofType: "png")
if let path = imgPath {
return UIImage.init(contentsOfFile: path)
}
return nil
}

//获取bundle
func myBundle() -> Bundle? {
    let bundle = Bundle.init(for: FNScrollHeaderView.self)
    let bundleUrl = bundle.url(forResource: "FNScrollComponentSwift", withExtension: "bundle")
    if let url = bundleUrl {
        return Bundle.init(url: url)
    }
    return nil
}

私有库地址:https://e.coding.net/wojia/testdemo/FNScrollComponentSwift.git

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

推荐阅读更多精彩内容