原因

随着团队的扩充,项目的增多,公司级私有库势在必行,其中基础库的构建尤为重要,话不多说进入正题。

名词

repo:资源库,通常我们叫它索引库,repository的缩写,pod自带一个trunk,以前是master,今天就是要创建我们自己的索引库,索引库里可以存放很多podspec文件,每个文件就可以获取一个库。

podspec:也叫spec文件,类似库的配置文件,里面包含了库的名字、版本、源地址、本地路径、...很多,pod会根据配置拉取库文件;

拉取流程




Ios Pod库引用swift podspec引用私有库_Powered by 金山文档


常用命令

//1. 查看本地索引库
pod repo
// 2.本地索引库的名字 远程索引库的地址, 在podfile文件里添加source也会自动添加
pod repo add XXKitSpec https://XXXXXX.KitSpec
// 3.在find中查看
// /Users/xxx/.cocoapods/repos
// 4. 想删除,可以手动删除对应的文件夹,也可以使用命令
pod repo remove XXKitSpec


// 验证本地仓库和podspec是否正确 --allow-warnings跳过警告
pod lib lint --allow-warnings
// 如果有遇到验证问题,使用跳过验证也可以
pod lib lint --skip-import-validation
// 验证本地仓库和远程仓库 
pod spec lint --allow-warnings
// 验证通过,将私有仓库和私有索引仓库关联起来 前面是本地Repo名字 后面是podspec名字
pod repo push XXKitSpec XXKit.podspec --allow-warnings 

// 更新所有仓库集
pod repo update
// 只更新特定的仓库集
pod repo update TestPrivatePodSpecs

步骤

建立私有的索引库

在公司仓库建立索引仓库,只需要一个空白项目即可选择私有


Ios Pod库引用swift podspec引用私有库_pod私有库_02


Ios Pod库引用swift podspec引用私有库_Powered by 金山文档_03


复制Https地址 在终端使用命令:

pod repo add 索引库名字 索引库地址


Ios Pod库引用swift podspec引用私有库_pod私有库_04


pod repo 查看目录,私有索引库已经存在,创建完成。

建立私有的组件库

建立组件库项目

创建私有的pod组件库,执行命令:

pod lib create 组件名字


Ios Pod库引用swift podspec引用私有库_pod私有库_05


填写完这些选项,会自动打开工程


Ios Pod库引用swift podspec引用私有库_pod私有库_06


添加组件代码

找到项目,删除ReplaceMe文件,将需要封装的文件复制到Classes文件下

cd 到Example文件下,执行pod install,工程内的pod就自动安装好了

修改.podspec

官网有参数说明,需要更详细的可以去这里查看


Ios Pod库引用swift podspec引用私有库_iOS私有库_07


验证代码和.podspec文件

cd到xx.podspec所在文件夹下,执行pod lib lint --allow-warnings,该命令是检查本地索引文件是否符合推送规则。成功了会打印KYKit passed validation。


Ios Pod库引用swift podspec引用私有库_pod私有库_08


pod lib lint参数解析:

--sources:需要引⽤的spec,默认只依赖master,如果当前pod依赖了私有库,需要将其对应的spec包含进来,不然会报找不到对应库的问题。参数可以是本地spec的名称,也可以是git地址。

--allow-warnings:有警告会通过不了,如果警告是⽆关紧要的,可以加上,让检测通过。

--verbose:打印详细的检验过程

--use-libraries:⼯程或者依赖⾥⾯了静态库(*.a⽂件)或者是framework

备注:

pod lib lint 表示在本地校验索引文件

pod spec lint 表示在本地和远程都校验索引文件

关联远程组件库

cd 到上层有.git的文件,关联远程

在公司的 git 服务器上面创建组件的 git 远程仓库,复制https地址,和上面索引仓库一样

在终端执行命令:

git remote add origin 复制的https地址
git add .
git commit -m "第一次提交版本为0.0.5"
git push origin main
git tag 0.0.5
git push origin 0.0.5

本地组件工程已经和远程组件库关联

关联索引库和组件库

上面已经验证通过,已经打了tag且已经推送的远程组件仓库,剩下的就是把私有组件仓库和私有索引仓库关联,执行命令:

pod repo push KYRepos KYKit.podspec --allow-warnings

上面命令对 KYKit.podspec 文件做了两个操作:一个是将其推送到私有的远程索引仓库,可以去公司的 git 上面 KYRepos 索引仓库中查看;另一个是将其 copy 到私有的本地索引仓库,这个可以去目录:/Users/admin/.cocoapods/repos/KYRepos 下查看到。


Ios Pod库引用swift podspec引用私有库_git_09


上传成功,使用pod repo update更新本地仓库,到这里就完成了基本的私有库,可以使用pod search KYKit查看

使用

私有库的使用一定要加上私有索引库的远程地址

platform :ios, '9.0'

# 如果有依赖第三方库,可以加上cocoapods的索引库地址
source 'https://cdn.cocoapods.org/'
# 私有库地址
source 'https://code.juwan-inc.com/juwan/lolly/lolly_ios_com/KYRepos.git'

target 'KYModuleDemo' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for KYModuleDemo
  pod 'KYKit', '~> 0.0.3'
#  pod 'SDWebImage'
#  pod 'MJExtension' , '~> 3.4.1'
#
  target 'KYModuleDemoTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'KYModuleDemoUITests' do
    # Pods for testing
  end

end

注意事项

更新版本

修改代码后, 在.podspec文件修改s.version = '0.0.5'版本号,cd到.podspec文件目录下,执行命令:


Ios Pod库引用swift podspec引用私有库_pod私有库_10


git add .
git commit -m '添加0.0.5版本'
git push
git tag 0.0.5 -m '版本描述'
git push --tags

上面就完成了代码更新和tag添加,可以去仓库看下tag是否更新;

下面就是验证代码和.podspec规范,执行命令:

pod lib lint --allow-warnings

通过验证则通知索引仓库,添加了新的版本,执行命令:

// KYRepos:是索引库名字,KYKit.podspec是我们要推送的文件
pod repo push KYRepos KYKit.podspec --allow-warnings

通过验证后,就可以和其他库一样更新版本了。

多层级目录:subspec

有两种情况会使用这个,一个是我们想把不同职责的代码分装进不同的文件夹下,一种是我们想把一个大库拆分成多个子库。

建议把pod默认的 Classes 文件删掉,直接在KYKit文件下存放自定义的文件夹,


Ios Pod库引用swift podspec引用私有库_Ios Pod库引用swift_11


在增加多个一级目录时,验证找不到文件,单目录没有出现类似问题,大家可以看下结构:

# 文件的配置路径
    s.source_files = 'KYKit/KYKit.h'
    # 头文件的配置路径
    #  s.public_header_files = 'KYKit/KYKit.h'

    # Base
    s.subspec 'Base' do |ss|
      ss.source_files = 'KYKit/Base/KYKitMacro.h'

      ss.subspec 'Foundation' do |sss|
        
        sss.source_files = 'KYKit/Base/Foundation/*'
      end

      ss.subspec 'UIKit' do |sss|
        # 本地依赖
        sss.dependency 'KYKit/Base/Foundation'
        
        sss.source_files = 'KYKit/Base/UIKit/*'
      end

      ss.subspec 'Utils' do |sss|
        sss.source_files = 'KYKit/Base/Utils/*'
      end
    end
    
    # WebImage
    s.subspec 'WebImage' do |ss|
        
      ss.source_files = 'KYKit/WebImage/*'
      
    end

文件目录


Ios Pod库引用swift podspec引用私有库_git_12


'xxx.h' file not found 文件找不到

在组件工程里创建文件一定要看下文件权限等级,如果想在外部使用,放在header里,文件必须Public,否则就会报这个错误,我们打静态库也会用到这个;位置:在xcode下,选中文件,开启右边工具栏Target Membership,在对应target下点击右边会有显示,如图


Ios Pod库引用swift podspec引用私有库_git_13


如果要在外部显示必须选择Public。

库的依赖

写的组件一般有三种依赖,系统库依赖、第三方库依赖、自己其他子subspec的依赖;

系统库依赖

这个简单,例如我们使用的UIKit、Foundation、CommonCrypto,这都是基础依赖,我这边测试的结果是不写也不会报错,在podspec文件里填写如下

# 依赖库系统库
s.frameworks = 'UIKit', 'CoreFoundation', 'CommonCrypto'
第三方库依赖

我们经常会做一些第三方库二次封装,好处我就不多说了,这个时候我们就需要依赖第三方库,在podspec文件里填写如下

ss.subspec 'Foundation' do |sss|
   # 三方库依赖
   sss.dependency 'MJExtension', '~> 3.4.1'
        
   sss.source_files = 'KYKit/Base/Foundation/*'
end

如果有多个子目录,最好在依赖目录下加上依赖库,尽量不要在外层,上面我就是在Foundation这个目录下有依赖MJExtension,如果没有子目录,改成单s,把s.dependency 'MJExtension', '~> 3.4.1' 放到 s目录下就行了。

自己其他子subspec的依赖

这个问题我搞了很久,我一直认为自己写的虽然分成了多个目录,但是在一个header文件引用,测试了很多次,看了AF的podspec,只能老实的加上子集文件路径依赖,最后问题解决。

ss.subspec 'UIKit' do |sss|
  # 本地依赖
  sss.dependency 'KYKit/Base/Foundation'
        
  sss.source_files = 'KYKit/Base/UIKit/*'
end

如果有多个子subspec,在subspec引用其他subspec下的文件,则必须添加本地subspec依赖。

持续更新

...