前言
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
正常情况下会有一个公有的CocoaPods官方的master repo 和你的 私有库spec repo,可以通过~/.cocoapods/repos目录看到它们在本地的存放路径。
3、创建远程代码仓库
远程代码仓库是用来管理某一个组件的代码仓库,它和索引库不是同一个仓库。这个远程代码仓库可以是svn、码云、git。和创建索引库流程一样创建一个代码仓库。我这边创建的是一个TestLib代码仓库。
4、创建本地代码库
这个就是某个组件的本地代码库,在想要创建的目录文件夹下创建pod私有库。
1、在该目录下使用命令:pod lib create TestLib
之后会出现几个问题,按照提示
选择使用平台
选语言 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
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
5、编辑podspec文件
上传完工程后就可以开始编辑podspec文件了,这里是TestLib.podspec文件,它是一个Ruby文件,用SubLime打开它,把编辑格式改成Ruby就能看到语法高亮了,原始的podspec文件已经有很多内容了,其中以#开头的都是被注释掉的部分,看起来应该像下图所示:
下面是编辑完成后的podspec文件,每个配置项后面都添加上了注释:
编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何warning或者error都是不可以的,它就不能被添加到Spec Repo中。验证需要执行以下命令:
有两种验证方式:
本地验证:pod lib lint your_podName.podspec 是检索本地文件
联网验证:pod spec lint your_podName.podspec 是本地和远程库提示检索
当你看到
表示验证通过了,不过这只是说明这个podspec文件是合格的,验证的时候也出现过错误,如下:
是因为远程仓库虽然创建了,但是没有初始化,初始化之后重新验证就可以验证通过。
验证通过了,不过最好还是在本地项目调用再验证下,验证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的名称)
同样的加上上面验证时使用到的可选参数
7、私有组件库制作完成后,可以使用pod search命令验证一下
pod search TestLib
8、在其他项目如何使用:新建一个工程
在Podfile 文件里做引用,然后pod install即可,不要忘记把 自己的索引库 添加到source 配置项里
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