CocoaPods 安装步骤和使用
一 CocoaPods 介绍
安装完 CocoaPods 后, 先来查看仓库
pod repo
查看仓库
其实仓库就在 cocoapods 隐藏文件夹中, 如下:
.cocoapods
这个文件夹是当安装了 cocoapods 后, 第一次 pod install 的时候, cocoapods 通过命令 pod setup 来建立的 (这个 pod setup 命令是不需要手动执行的) 不过如果想重建这个官方 repos 仓库集合的话, 可以执行下面命令:
- pod repo remove master
- pod setup
二使用 CocoadPods 创建私有库
1 在 Github 上创建一个空的仓库, 这个仓库是用来存放私有库 spec 的当然也可以使用其他代码托管创建仓库
Github
2 在 Github 上创建另一个空的仓库, 这个仓库用来存放私有库的源码
Github
3 创建一个本地私有仓库
pod repo add MxZSpec https://github.com/vincentgemini/MxZSpec.git
注意这个只是创建而已, 也就是只是在~/.cocoapods/repos 目录下添加了一个文件夹而已, 并没有在其中添加 spec 文件
4 创建 spec 库索引
pod lib create MxZFramework
创建 spec 库索引
打开 spec 文件
默认 spec 文件
s.name: 名称, pod search 搜索的关键词, 注意这里一定要和. podspec 的名称一样, 否则报错
s.version: 版本号
s.ios.deployment_target: 支持的 pod 最低版本
s.summary: 简介
s.homepage: 项目主页地址
s.license: 许可证
s.author: 作者
s.social_media_url: 社交网址, 这里我写的微博默认是 Twitter, 如果你写 Twitter 的话, 你的 podspec 发布成功后会 @你
s.source: 项目的地址
s.source_files: 需要包含的源文件
s.resources: 资源文件
s.requires_arc: 是否支持 ARC
s.dependency: 依赖库, 不能依赖未发布的库
5 把创建好的 MxZFramework 推到远端
- git status
- git add .
- git commit -m 'init'
- git remote add origin https://github.com/vincentgemini/MxZFramework.git
- git push origin master
- git tag '1.0.1'
- git push --tags
由于 cocoapods 的 repo 是基于 git 的 tag 的, 所以需要给 MxZFramework 添加一个 tag. 注意, 这里添加的 tag 需要和 podspec 文件中描述的一致, 不然以后别人引用的时候, cocoapods 就不知道该下载什么代码了
6 在 MxZFramewrok 中添加需要的源码库
MxZFramewrok 文件结构
7 编辑库索引, 打开 1 生成的 spec 文件, 修改后如下:
MxZFramework.podspec
8 本地测试库索引, 由于可以忽略警告, 经常使用如下命令
pod lib lint MxZFramework.podspec --verbose --allow-warnings
如果当前工程只有一个 podspec, 可以省略 podspec,--verbose 可以详细打印测试过程
测试成功. png
9 远端测试库索引, 在测试前, 需要先将本地的源码库推到远端此处注意 tag 一定要与 podspec 中的 tag 一致
- git status
- git add .
- git commit -m 'modify'
- git push origin master
- git tag '1.0.1'
- git push --tags
上传成功后, 再使用如下命令
pod spec lint MxZFramework.podspec --allow-warnings
测试成功
有时本地测试可以通过, 但远端测试无法通过, 多半是由于远端代码库的文件结构不对, 导致无法找到文件此时需要对照一下索引库和远端代码库的对应关系
10 在私有仓库中添加库索引
pod repo push MxZSpec MxZFramework.podspec
由于索引中一些警告未处理, 所以如下如下提示:
失败
解决办法:
pod repo push MxZSpec MxZFramework.podspec --allow-warnings
成功
MxZSpec.github
11 检验私有库
pod search MxZFramework
如下提示表示已经创建成功
检验私有库
三使用私用库开发
1 创建一个测试工程 testTFW, 进入到工程目录, 初始化 Podfile
pod init
2 修改 Podfile
Podfile
3 构建 pod
pod install
提示
失败的原因是: pod install 只会在 master 下搜索, 所以需要制定仓库
Podfile
成功
testTFW.project
四总结
以上仅仅是本人利用 cocoapods 封装私有库的简单过程, 稍后会持续补充一些遇到的新问题
以下为补充部分
2018.2.24
在添加 USER_HEADER_SEARCH_PATHS 变量时, 发现添加后还是找不到相应的文件解决办法设置绝对路径:
- $dir = File.dirname(__FILE__)
- $dir = $dir + "/MxZFramework/Vendors/FFmpeg-iOS/include/**"
- s.xcconfig = { "USER_HEADER_SEARCH_PATHS" => $dir}
如果私有库中使用了静态库, 那么在 pod lib lint 或者 pod spec lint 时需要加上 --use-libraries, 并且后面添加索引的时候也需要使用 --use-libraries
- pod spec lint --use-libraries
- 2018.3.7
使用 inhibit_warnings 或 inhibit_all_warnings 去掉第三方 Pod 中的警告
2018.3.8
简单记录:
- # 依赖第三方 Framework
- s.vendored_frameworks = 'Pod/ThirdModule/**/*.framework'
- # 依赖第三方 Lib
- s.vendored_libraries = 'Pod/ThirdModule/**/*.a'
- # 依赖系统 Framework
- s.frameworks = 'UIKit', 'QuartzCore', 'CoreGraphics', 'Accelerate', 'AssetsLibrary', 'OpenAL', 'OpenGLES'
- # 依赖系统 Lib
- s.libraries = 'icucore', 'c++', 'stdc++', 'stdc++.6', 'z', 'bz2', 'iconv', 'resolv', 'sqlite3', 'protobuf'
私有库中依赖私有库
在 podspec 中正常编写依赖 pod 关系:
s.dependency 'xxxModule', '1.0.1'
在检测 podspec 时, 需要增加 sources:
pod lib lint --use-libraries --verbose --allow-warnings --sources='https://github.com/CocoaPods/Specs.git,http://xxxxx/app/Speaces.git'
预编译头文件:
- # 方法一
- s.prefix_header_contents = '#import <UIKit/UIKit.h>', '#import <Foundation/Foundation.h>'
- # 方法二
- s.prefix_header_contents = <<-EOS
- #ifdef __OBJC__
- #import "MxZHeader1.h"
- #import "MxZHeader2.h"
- #endif
- EOS
- end
- # 方法三
- s.prefix_header_file = 'Classes/include/prefix.pch'
源文件:
- s.source_files = 'Classes/**/*.{h,m}'
- s.source_files = 'Classes/**/*.{h,m}', 'Others/**/*.{h,m}'
ARC 设置:
- s.requires_arc = false
- s.requires_arc = 'Classes/Arc' // 该文件夹下是 ARC, 其它非 ARC
- s.requires_arc = ['Classes/*ARC1.m', 'Classes/ARC2.m']
compiler_flags 设置:
s.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
资源设置:
- s.ios.resource_bundle = { 'Resources' => 'Assets/XXX/Resources/*.png' }
- s.resource_bundles = {
- 'Resources' => ['Assets/XXX/Resources/*.png'],
- 'Other' => ['Assets/XXX/Other/*.png']
- }
另一种资源设置:
- s.resource = 'Resources/MxzKit.bundle'
- s.resources = ['Images/*.png', 'Sounds/*']
更多资料:
CocoaPods 系列教程
来源: http://www.jianshu.com/p/46df9d2cbac9