Cocoapods私有库之Swift版

4,158 阅读7分钟

Cocoapods私有库的OC版本网上已经有很多介绍了,也介绍得很好。但是发现对Swift版的介绍得不多,虽然两者差距不大,但总归还是有不一致的地方。今天就和小伙伴们一起来了解如何制作一个Swift版的私有库。

1、创建私有Spec Repo

创建私有库之前,我们先看看公有库。在Finder中打开: ~/.cocoapods/repos。可以看到目录下有 master 文件夹,这就是公有库的git仓库。

1.1 创建私有git仓库作为私有的Repo 这里我使用github创建远程仓库,小伙伴可执行选择自己的远程仓库。

按上图操作,完成远程仓库【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 添加一个分类。可以设置 UIViewcornerborder

为了方便链式调用,函数返回值都是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 路径一定要正确。