CocoaPods 私有库搭建

私有三方库

Posted by Miaocf on August 16, 2019

在 iOS 开发过程中,经常会使用cocoapods管理三方库,如果自己的库不想公开,只方便自己公司的人用,该怎么办呢?这里介绍一下如何搭建一个私有的Pods库。

  • CocoaPods的原理
  • 创建私有库

CocoaPods的原理

  1. 第三方库会被编译成.a静态库供我们真正的工程使用。
    CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程在Pods目录下。整个第三方库工程会生成一个名称为libPods-xxx.a的静态库提供给主工程使用。对于资源文件,CocoaPods 提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。

  2. 工程和第三方库所在的工程会由一个新生成的workspace管理
    为了方便我们直观的管理工程和第三方库,CocoaPodsTest工程和Pods工程会被以workspace的形式组织和管理,也就是xxxx.xcworkspace文件。

  3. CocoaPods通过Pods-Podtest.release.xcconfig的文件来在编译时设置所有的依赖和参数。

  4. 原来的工程设置已经被更改了,直接打开原来的工程文件去编译就会报错,使用新生成的workspace来进行项目管理。

创建私有库

创建私有库的大体步骤为:

1. 准备工作

创建两个私有远程仓库 SpecRepo 和 LibRepo

  • SpecRepo 仓库用来存储spec文件
  • LibRepo 用来存储项目工程文件

2. 创建pod私有库的项目工程

  • cd到合适目录下用命令行创建工程,执行 pod lib create podName ,按提示输入需要的内容.
  • 修改podspec文件
  • 修改完成后,cd 到Lib目录下执行pod lib lint
    podspec 文件保存了所有要对三方库的配置,包括要引用的依赖、模块划分、源文件、公共头文件等.

3. 将本地项目文件上传到远程私有库中

1
2
3
4
5
6
7
8
$ git remote add origin http://git.xxxx.cn/APP/ios/LibRepo.git
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master
//tag 值要和podspec中的version一致
$ git tag 0.1.0
//推送tag到服务器上
$ git push --tags

这时查看远程仓库应该有自己的项目文件了

4. 校验spec

在项目所在目录执行 pod spec lint

5.创建spec repo

运行以下命令: pod repo add SpecRepo http://git.xxxx.cn/APP/ios/Spec.git
在本地创建 SpecRepo,进入文件夹cd ~/.cocoapods/repos 可以查看本地的repo list,
可以看到新添加的 SpecRepo, SpecRepo根据需要可自定义命名。
注意 此处地址是spec仓库地址
推送 podspec 到 specs repo
进入到代码路径,也就是包含podName.podspec文件的路径,然后运行命令 pod repo push SpecRepo podName.podspec --sources=http://git.xxx.cn/APP/ios/Spec.git

如果发生异常或失败,可以尝试添加两个参数:

1
 pod repo push SpecRepo podName.podspec --sources=http://git.xxx.cn/APP/ios/Spec.git --allow-warnings --verbose --use-libraries

6. 验证

创建一个新的项目 编写podfile文件

1
2
3
4
5
6
7
8
9
source 'http://git.xxxx.cn/APP/ios/Spec.git'

platform :ios, '9.0'

target 'TestPods' do
  use_frameworks!
  pod 'podName'

end

cd项目中 执行pod install

7. 更新spec文件

更新 podspec 文件后:

  1. 将更新的podspec 文件更新到 git 库
  2. 更新本地 repo 相关私有库的 podspec 文件,命令如下: podName 是私有库的名称.
1
  pod repo update podName

subspec

代表了一个库的其中一个模块的说明。 subspec 支持嵌套

注意事项

  • pods 在安装的时候,遇到体积较大的文件会报early EOF的错, 需要设置postBuffer来解决这个问题
1
2
 $ git config --global http.postBuffer 1073741824  
 $ git config --list
  • pod install pod update 区别
    pod update AFNetworking 单独更新某一个库.

  • 不更新 podspec
    CocoaPods 在执行pod install和pod update时,会默认先更新一次podspec索引。使用–no-repo-update参数可以禁止其做索引更新操作。如下所示:

1
2
 pod install --no-repo-update
 pod update --no-repo-update
  • 使用私有的 pods
    通过直接指定某一个依赖的podspec,就可以使用内部的私有库。有利于使企业内部的公共项目支持 CocoaPods。示例:
    pod 'MyCommon', :podspec => 'https://suning.com/common/myCommon.podspec'
1
2
unknown: Encountered an unknown error (Unable to find a specification for 
pod spec lint --verbose --use-libraries --allow-warnings --sources='https://github.com/CocoaPods/Specs.git,http://xxxprivate_lib.git'

参考资料
cocoaPods文档
cocoaPods 原理
cocoaPods 管理
subspec

关于转载

知识共享许可协议

本作品采用知识共享署名 4.0 国际许可协议 进行许可。 转载时请注明原文链接。图片在使用时请保留图片中的全部内容,可适当缩放并在引用处附上图片所在的文章链接。