Cocoapods私有库之Swift版
Cocoapods私有库的OC版本网上已经有很多介绍了,也介绍得很好。但是发现对Swift版的介绍得不多,虽然两者差距不大,但总归还是有不一致的地方。今天就和小伙伴们一起来了解如何制作一个Swift版的私有库。
1、创建私有Spec Repo
创建私有库之前,我们先看看公有库。在Finder中打开: ~/.cocoapods/repos。可以看到目录下有 master 文件夹,这就是公有库的git仓库。
1.1 创建私有git仓库作为私有的Repo
按上图操作,完成远程仓库【BOTestSpec】的创建。
1.2 执行repo 命令添加私有库Repo
打开终端,在任意目录下执行下面的命令:
pod repo add BOTestSpec https://github.com/Lwindy/BOTestSpec.git
解释:
pod repo add 【私有库名称】【1.1中创建的远程仓库的git地址】
再次打开 ~/.cocoapods/repos,如果能看到多一个 BOTestSpec 文件中,则说明创建成功。
2、创建组件库
私有Spec创建完成了,但是里面并没有内容,所以我们还需要添加组件库到私有库里,丰富我们的私有库。
2.1 使用 pod 命令创建组件库
pod 创建组件库的命令使用可以查看官方文档:Using Pod Lib Create。
cd到你要保存项目的目录然后执行下面的命令:
pod lib create BOTestTools
紧接着,会有一些参数需要配置:
配置完成后,会自动打开创建的项目。
如果你的选择和上图的不一致,可能会生成不同的项目。
2.2 创建项目远程仓库
按上图创建【BOTestTools】仓库,存放组件项目。
远程仓库创建好后,clone到本地,存放在你想要保存的目录。
2.3 将pod创建的项目文件copy到BOTestTools本地仓库里
将这四个文件拷贝到clone下面的文件夹下。
2.4 配置podspec文件
打开 BOTestTools本地仓库中的 Example 中的工程。
选择 BOTestTools.podspec 文件:相关字段可以查询官方文档【Podspec Syntax Reference】。
这是我项目中podspec文件,小伙伴们可以作为参考。
Pod::Spec.new do |s|
s.name = 'BOTestTools'
s.version = '0.1.0'
s.summary = 'A short description of BOTestTools.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/LWindy/BOTestTools'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'LWindy' => 'windy.lin@163.com' }
s.source = { :git => 'https://github.com/LWindy/BOTestTools.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'BOTestTools/Classes/**/*'
end
2.5 添加类到组件项目
添加文件 Tools.swift 到 BOTestTools文件夹下的Classes文件夹中。Tools.swift 文件中简单的给 UIView 添加一个分类。可以设置 UIView 的 corner 和 border。
为了方便链式调用,函数返回值都是Self。而且为了能访问函数,需要给函数加public。
向库中添加文件或者修改文件,都需要执行
pod update
才可以在 Example 工程中使用。
2.6 使用示例
在 Main.storyboard 中给 View 添加一个 按钮。
再在 ViewController.swift 中使用 import BOTestTools
导入私有库 BOTestTools。
在 viewDidLoad
方法中,设置 按钮btn 的圆角和边框。
3、添加资源文件
假如要向私有库中添加一张图片,需要使用 Assets来保存资源。
3.1 添加图片资源
在Assets目录下添加 ToolsAsset.xcassets,用来存放图片。如上图所示,添加一张测试图片进入Assets中。
3.2 更新podspec文件
同时,由于添加了资源,所以需要更新 podspec 文件,增加 s.resource_bundles 字段。
Pod::Spec.new do |s|
s.name = 'BOTestTools'
s.version = '0.1.0'
s.summary = 'A short description of BOTestTools.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/LWindy/BOTestTools'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'LWindy' => 'windy.lin@163.com' }
s.source = { :git => 'https://github.com/LWindy/BOTestTools.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'BOTestTools/Classes/**/*'
s.resource_bundles = {
'BOTestTools' => ['BOTestTools/Assets/*.xcassets']
}
end
BOTestTools/Assets/*.xcassets
为图片资源的路径,需要和你存放图片的路径保持一致。
3.3 访问图片资源
由于私有库中的Bundle内的资源无法直接访问,所以添加 BOTools
类来获取资源。
向 Classes 目录下添加 BOBundleTool.swift 文件。
import UIKit
public class BOTools {
static var bundle: Bundle = {
let bundle = Bundle.init(path: Bundle.init(for: BOTools.self).path(forResource: "BOTestTools", ofType: "bundle", inDirectory: nil)!)
return bundle!
}()
public static func getBundleImg(with name: String) -> UIImage? {
var image = UIImage(named: name, in: bundle, compatibleWith: nil)
if image == nil {
image = UIImage(named: name)
}
return image
}
}
BOTools 类也需要添加 public 关键字,否则外界无法访问。
其中需要特别注意的是bundle路径的获取。
Bundle.init(for: BOTools.self).path(forResource: "BOTestTools", ofType: "bundle", inDirectory: nil)
forResource参数:必须和组件库的名称保持一致。
3.4 图片资源使用示例
添加图片完成后,一定要执行 pod update
才可以在 Example 工程中访问。
在视图上添加 UIImageView,同时给按钮绑定点击事件。实现点击按钮,加载图片。
加载图片的代码如下:
let img = BOTools.getBundleImg(with: "1")
imgView.image = img
运行结果如下:
ps:如果图片无法加载或者报错,可以 clean 一下项目,然后重试。
实现到这一步,基本上一个组件库已经制作完成了。但是现在还只是在本地,只能自己使用。如果和你一起协同开发的小伙伴也要使用你的库,那么你还需要将组件库上传至git。
在上传之前,还需要验证 podspec 是否正确。否则别人是无法使用的。
4、验证 podspec 是否无误
cd 到 BOTestTools 文件夹下。其目录下有 BOTestTools.podspec 文件。
在执行如下命令:
pod lib lint --allow-warnings
执行结果如下:
如果出现:BOTestTools passed validation. 那么说明本地校验通过。
但是会发现有两个WARN警告⚠️,小伙伴可能也会遇到,那么我们来看看这两个警告是什么意思。
-
summary: The summary is not meaningful.
这是因为你没有修改 .podspec 文件中的
s.summary
字段。只需要修改 .podspec 文件即可。如下:
s.summary = '这是一个测试组件库'
-
[iOS] swift: The validator used Swift 3.2 by default because no Swift version was specified.
这是因为我们还没有指定当前组件库中Swift的使用版本。
在当前目录下执行如下命令,指定Swift版本为4.0:
echo "4.0" > .swift-version
解决完上面两个WARN之后,再执行pod lib lint --allow-warnings
命令就会发现没有警告了。
5、提交组件库到BOTestTools git仓库
将代码提交到git仓库:
1、执行 git add .
2、执行 git commit -m 'first commit',注意写好注释
3、执行 git push origin master 将代码提交到远程仓库
现在你可以在远程仓库中看到你提交的代码了。
仅将代码提交到git仓库还不够,还需要打上tag。并且该tag需要和 .podspec 文件中的版本 s.version = '0.1.0'
保持一致。
4、执行 git tag 0.1.0 打好tag
5、执行 git push --tags 将tag推送到git仓库
6、将 podspec 提交到git仓库
在上一步上将组件库提交到git仓库后,你的小伙伴还是无法使用。还需要将 .podspec 文件提交到 BOTestSpec git库中。
执行如下命令:
pod repo push BOTestSpec BOTestTools.podspec --allow-warnings
pod repo push 【私有库名称】 【podspec文件名】 --allow-warnings
结果如下:
则说明,BOTestSpec库上传成功。
同时,你还可以查看 ~/.cocoapods/repos。在 BOTestSpec 仓库下会多新增 BOTestTools 文件夹。如下所示:至此,你的私有库已制作完成。你和你的小伙伴们可以在项目中使用它了。
7、在项目中使用私有库
创建 BOSpecDemo 测试项目。
在项目目录下,执行命令:
pod init
编辑 podfile 文件:
platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git' # 官方库
source 'https://github.com/Lwindy/BOTestSpec.git' # 私有库Repo地址
target 'BOSpecDemo' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for BOSpecDemo
pod 'BOTestTools'
end
注意:私有仓库的地址一定是Spec Repo 的地址,不要错误的使用BOTestTools组件的git仓库。
然后执行 pod install
,添加私有库到工程中。
总结:私有库的制作不难,只是步骤比较繁琐。上述6步是我在实际使用中总结的步骤顺序,虽然不甚精简,但胜在稳定,基本可以一次性成功。
易错点:
1、混淆私有库repo仓库与组件仓库,之间的区别可以查看官方文档。
2、组件库制作完成后,要先push到git仓库再将.podspec push到repo仓库。
3、组件库一定要打tag标签。并且tag要和版本号一致。
4、.podspec 文件中的 source_files 和 resource_bundles 路径一定要正确。