iOS 组件化之使用 Cocoapods 创建本地 Pod 库

574 阅读6分钟

之前在进行非组建化的项目开发时,发现每次进行文件级的更改时,都会改变项目中 project.pbxproj 文件的内容。如果是在多人协作的场景下,会经常需要进行 Git 的冲突解决,一旦解决错误,就会导致项目无法运行。

为了解决这个问题,我打将不同模块之间的隔离,从单纯的文件夹隔离改为 Pod 隔离,即将各模块都封装为本地 Pod。本文也是主要介绍如何使用 Cocoapods 创建本地 Pod,实现代码的 Pod 隔离。

创建本地仓库

1. 创建本地仓库文件夹

首先,我们要在项目的目录下创建一个用于存储项目所有本地 Pod 的文件夹,这里取名为 LocalDevelopmentPods。顺手的话,可以直接用命令行创建,创建文件的命令是 mkdir

image.png

2. 创建本地 Pod

创建本地 Pod 有两种可选的方法

方法一:创建文件夹,再创建 .podspec 文件

LocalDevelopmentPods 目录下创建一个和组件名称一致的文件夹,我这里创建的 Pod 名为 LocalPods。 同时,还需要创建如下所示的子文件夹,后面 .podspec 文件中填写的 source_filesresource_bundles 路径要与此相对应。

image.png

然后,在 LocalDevelopmentPods/Message 目录下,使用下面命令生成 .podspec 文件。

pod spec create Message

image.png

使用 vim LICENSE 命令创建 LICENSE 文件,内容可以复制下面(名称和邮箱记得修改)

Copyright (c) 2022 VeggieOrz <1710073927@qq.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

使用这种方法创建的本地 Pod 成品目录如下:

image.png

方法二:使用 pod lib create xxx 一键生成

使用该方法会根据 Pod 模版生成组件,里面会带有 git 管理、example 工程、LICENSE 协议等内容,相对比较便捷。命令如下:

pod lib create Message

输入命令后需要填写一些选项,参考如下:

image.png

因为本地 Pod 也会接受主工程的 Git 管理的,所以可以删除 \Message 目录下的 .git ,取消该组件的独立的 Git 管理。命令如下:

rm -rf .git

注意:通过该方法生成的一些文件中可能会存在一些用户信息(如用户名、邮箱),如果不想后续误操作被上传到 Github 上,则需要手动删除\替换相关信息!!!

3. 修改 .podsepc 文件

.podsepc 文件相关填写内容如下,因为我们做的是本地 Pod, 一些远端相关的信息可以随意填写进行占位。

Pod::Spec.new do |s|

  s.name             = 'Message' # 组件名称
  s.version          = '0.1.0'   # 组件版本号
  s.summary          = 'A short description of FCUIKit.'  # 组件简述
  s.description      = <<-DESC   # 组件详细描述
TODO: Add long description of the pod here.
                       DESC
  
  s.homepage         = 'https://github.com/Bran/Message' # 组件主页地址
  s.license          = { :type => 'MIT', :file => 'LICENSE' }  # 配置的 license 文件信息
  s.author           = { 'VeggieOrz' => '1710073927@qq.com' }    # 作者信息
  
  # 组件下载源
  s.source           = { 
    :git => 'https://github.com/Bran/Message.git',  # 资源路径
    :tag => s.version.to_s                                # 资源版本号
  }  
  
  # 最小依赖系统版本
  s.ios.deployment_target = '15.0'          
  # 代码源文件目录
  s.source_files = 'Message/Classes/**/*' 
  # 资料文件目录
  s.resource_bundles = {
    'Message' => ['Message/Assets/**/*.*','Message/Resources/**/*.*','Message/Classes/**/*.*']
  }
  
  # 组件依赖
  # s.dependency 'AFNetworking', '~> 2.3' 
end

3.1 去除这个文件里所有跟 example 相关的内容,比如s.homepage。注意,这里内容都不能为空,不然会出警告

 s.homepage         = 'https://github.com/Bran/Message' # 组件主页地址

3.2 修改路径 -- tag是版本号

# 组件下载源
  s.source           = { 
    :git => 'https://github.com/Bran/Message.git',  # 资源路径
    :tag => s.version.to_s                                # 资源版本号
  } 
#  或者
 s.source       = { :git => "http://github.com/Bran/Message.git", :tag => "#{s.version}" }

4. 文件迁移

本地 Pod 的配置已经基本完成,只要需要把原先在模块中文件迁移到对应目录中即可。

image.png

5. 在原项目中依赖新 Pod

然后在需要引用项目的 Podfile 中声明对本地 Pod 的依赖。

pod 'Message', :path => './LocalDevelopmentPods/Message'

执行完 pod install 后,Xcode 打开工程可以看到开发仓中已经有了刚刚新建的 Message 啦~

image.png

将本地仓库上传到远端(github/smartgit/gitee等)

这里远端就用码云代替,去码云上建一个仓库:

image.png

获取仓库地址:

image.png

和本地仓库建立联系:

1.  cd /Users/72200499/Desktop/LocalPods  (进入到桌面的工程目录下)
2. git remote add origin git@gitee.com:branbin/message.git (和远端仓库建立联系)
3. git remote -v (查看关联远端)
     origin git@gitee.com:branbin/message.git (fetch)
     origin git@gitee.com:branbin/message.git (push)
4.git add . (把本地添加文件加入缓存区)
5. git commit -m '提交' (提交代码到本地仓库)
6. git push -u origin master -f (推送到远端)
7. git tag 0.1.0#(注意,这里的tag必须和.podSpec文件的版本一致)

git push --tags

在本地Cocoapods索引库中创建我们私有组件的索引库文件

同上述一样去码云上面建一个私有的索引库 (索引库不要和上面的私有库用一样地址).

建完索引库

通过这个命令本地索引库管理:

 pod repo add 私有组件名称 索引库远程地址 

 pod repo add Message git@gitee.com:branbin/message.git

执行完命令 本地Cocoapods索引库会出现 Message 文件

把自己私有库的索引添加到自己私有库中:

  • pod repo push 索引库名称 当前组件中podspec文件 (记得要把podspec文件里s.source 地址换成自己的远程地址
 1. cd /Users/72200499/Desktop/LocalPods

 2.  pod repo push Message Message.podspec --allow-warnings
  • 执行完命令 索引库里面会多一个版本0.1.0
  • 到这里制作自己的私有索引库就完成了.

使用:

source https://gitee.com/branbin/message.git

更新库

如果修改代码或者添加文件,需要更新pod库

 1.组件中podspec文件把版本提高一个

 2.提交代码到远端库,打上tag,tag和podspec文件里面版本一样

 3.pod repo push TJYNetWork TJYNetWork.podspec --allow-warnings

 这样pod库就提高了一个版本

公有的pod库

公用的pod是要把spec上传到cocospod官方的 

1.将spec索引上传到官方需要先注册,命令如下

     pod trunk register 电子邮箱 '您的姓名' 

   注意邮箱必须正确,收到邮件后需要点击连接确认激活。 

  1. 激活后将spec push到官方,这个过程可能需要一点时间,请耐心等等待。
pod trunk push Message.podspec  
pod trunk push Message.podspec --allow-warnings   //上面不通过可以使用这个忽略警告的

参考: juejin.cn/post/690968…