在 iOS 开发过程中,经常会使用cocoapods管理三方库,如果自己的库不想公开,只方便自己公司的人用,该怎么办呢?这里介绍一下如何搭建一个私有的Pods库。
- CocoaPods的原理
- 创建私有库
CocoaPods的原理
-
第三方库会被编译成.a静态库供我们真正的工程使用。
CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程在Pods目录下。整个第三方库工程会生成一个名称为libPods-xxx.a
的静态库提供给主工程使用。对于资源文件,CocoaPods 提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。 -
工程和第三方库所在的工程会由一个新生成的workspace管理
为了方便我们直观的管理工程和第三方库,CocoaPodsTest工程和Pods工程会被以workspace的形式组织和管理,也就是xxxx.xcworkspace文件。 -
CocoaPods通过
Pods-Podtest.release.xcconfig
的文件来在编译时设置所有的依赖和参数。 -
原来的工程设置已经被更改了,直接打开原来的工程文件去编译就会报错,使用新生成的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 文件后:
- 将更新的podspec 文件更新到 git 库
- 更新本地 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'