前言
不知道你们是否好奇过,SDWebImage的代码,为什么podfile中配置一下,然后pod isntall就可以下载下来?我们应该如何才可以开发一个可以用cocoapods管理的开源库?
一、 原理
从上图来看,大概需要了解这几个流程:
- 我们的代码,需要push 到 trunk库中;
- trunk 会更新到 github的specs repo库
- 更新后,我们才能用pod install 安装我们push上去的代码。
二、过程
2.1 创建工程
- 用命令行进入工程要创建的位置
cd /Users/xxx/Desktop/YZFaceTool
- 创建模板工程
pod lib create YZFaceTool
注意:
(1)YZFaceTool 是开源库的名字,可以根据自己的功能开取名;
这个命令执行后,命令行会问下面几个问题:
(2)当被问及创建Swift还是OC项目,按自己要求回答,我选择ObjC;
(3)当被问及是否创建一个demo应用包含在工程里,根据需要,如果需要写一个demo示例,就选择Yes,否则选择NO,我这里选择Yes;
(4)当被问及是否需要使用测试Framwork,选择NO;
(5)当被问及是否需要做接界面调试,我这里选择NO;
(6)还有一个就是工程文件的前缀,我这里是自己的名字的缩写,这个随意写;
完成后,进入文件夹,可以看到命令行我们创建一个了模板的工程,如下图:
2.2 添加代码,并模拟测试使用
进入上图中,Classes那个文件夹,放入要上传的代码,如下图:
然后,用命令行进入Exmaple, 然后pod install 模拟下载你添加的代码,如下图:
这样,就可以模拟其他用户 pod install
你的开源库。此时,可以在项目中模拟测试一下,是否可用,如果没有问题,就可以准备上传到cocoapods库了。
2.3 上传代码到cocoapods中
2.3.1 需要在GitHub上新建一个项目地址
新建完成后,会进入如下的页面:
2.3.2 配置podSpec文件
这个文件是非常重要的,配置的时候要小心,但是只需要配置几处地方:
(1)podSpec文件的位置,如下图:
(2)配置的注意项:
查看一下配置是否正确,如果正确的话,就可以把本地项目与GitHub创建的项目地址关联起来了。
2.3.3 GitHub地址关联项目
用命令行关联,需要先回调主目录:
然后用命令行: git remote add origin url(gitlab的工程的url)
git remote add origin https://github.com/lyz0925/YZFaceTool.git
关联完后,就提交代码:
git add .
git commit --m “xxxx”
提交完后,可以到GitHub上查看一下是否有你提交的代码和信息,如下图:
如果已经提交上去了,就可以验证了。
2.3.4 本地验证
在命令行中输入如下的代码:
pod lib lint YZFaceTool.podspec
注意:
(1)YZFaceTool.podspec要替换成自己的具体的.podspec的名字
过一会儿如果出现以下的错误:
说明需要忽略警告,那就在命令行添加--allow-warnings
, 如下:
pod lib lint YZFaceTool.podspec --allow-warnings
执行,等一会儿,如果没有问题,就出现下图的 passed validation
。
如果成功了,就可以打tag了。
2.3.5 打tag
这个tag要注意跟podspec里面写的version
要保持一致,回忆一下这个version在哪里,如下图:
命令行打tag如下:
git tag 0.1.0
git push --tags
这两个操作是,先打tag 然后上传到远端上,这俩操作完后,可以去GitHub上查看是否有tag,如下图:
如果有tag,说明tag打成功了,可以进入tag,然后点击下载查看一下,下载下来的代码是否跟你代码一样。如果一样,说明你的开源代码已经上传上去了。但是这时候还不能给其他人使用。
如果没有问题的话,就可以走远程校验了。
2.3.6 远程校验
命令如下:
pod spec lint YZFaceTool.podspec
如果成功了,就可以推倒trunk里了。
2.3.7 推到trunk
在推到trunk之前,需要检查一下,自己是否有trunk账号,用命令
pod trunk me
如果出现下图:
表示已经有trunk账户了,如果不是,就注册一个trunk账户。
2.3.7.1 注册trunk
pod trunk register xxx@cocoapods.org 'huangxx' --description='huangxx' macbook pro' --verbose
- xxx@cocoapods.org - 一个真实存在的邮箱,不一定非得是@cocopods.org,例如QQ。
- huangxx - 用户名
- huangxx’s macbook pro - 描述性文字
如果所有的步骤都能成功的话,你会受到一份邮件,需要点击验证下。
2.3.7.2 推podspec到trunk上
pod trunk push YZFaceTool.podspec
执行命令,如果出现下图,就表示成功了:
查看cocoapods的spec库是否有自己的上传的
进入该网址:https://github.com/CocoaPods/Specs/tree/master/Specs
查看自己上传的,如果能找到,说明上传成功了。
3. 添加图片资源
3.1 方式一:利用自带Assets添加资源
-
当使用CocoaPods管理远程仓库的代码时, 都会有一个podspec文件, 在这个文件中, 我们需要加入几句代码来表示需要引用的资源, 路径等, 如下图:
-
上述图片中的路径位置在下面的图中
-
将图片资源放在Assets文件夹中
-
当图片放置好, podspec文件也添加引用资源的代码后, 使用终端cd到当前工程, 并执行pod install
3.2 方式二:将资源和代码都放在classes下
效果如下:
每个小功能上,都有对应的一个Resources 存放这个功能对应的小资源。
步骤:
(1)按照如下的格式,添加资源
(2)修改spec的文件
4. 引用资源
- 使用CocoaPods添加的代码库, 在工程编译后, 图片等资源会在包的下图位置
- 使用代码查找当前文件所在的bundle包可以使用NSBundle类的+ (NSBundle *)bundleForClass:(Class)aClass;方法
- 图片资源都会在LTFM.bundle包中, 所以在引用图片的时候, 不能使用[UIImage imageNamed:@“图片名”]的方式, 而是需要使用图片路径来加载图片;如果直接使用[UIImage imageNamed:@“图片名”] 查找图片, 那么就不会加载出来
- 使用图片的代码:
- (UIImage *)getImageWithName:(NSString *)imageName {
NSBundle *currentBunle = [NSBundle bundleForClass:self.class];
// IGFrame 需要替换成 你自己的Framework的名字(如果自定义了bundle, 就用自定义的bundle的名字)
NSString *filePath = [currentBunle pathForResource:[NSString stringWithFormat:@"%@@2x.png",imageName] ofType:nil inDirectory:@".bundle"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
if (image == nil) {
image = [UIImage imageNamed:imageName];
}
return image;
}