每种语言都会有它相应的类库依赖管理工具,比如Java的ant、maven、gradle,Node.js的npm等。那么在开发iOS应用时,也会引用到很多第三方的开源类库,这时为了方便管理这些类库,提高我们的开发效率,我们就会使用到iOS的类库依赖管理工具——CocoaPods
。
CocoaPods简介
在开发iOS应用时,常常需要用到第三方开源类库,比如AFNetWorking、SDWebImage等,可能这些类库有依赖其他的类库,我们有需要把这些库下载下来再复制到项目中去,而有可能其他的类库又可能依赖其他的类库,这样就会造成无休止的去进行这些工作;另一个情况就是,这些依赖的类库有时候需要更新,那么就需要重新去下载,然后重新加到项目中去,非常繁琐。所以就需要一个工具帮你解决这些问题,这就是CocoaPods
,iOS开发中的最常用最出名的类库管理工具。通过CocoaPods,一行命令就可以解决以上的两个问题。
CocoaPods的安装
使用ruby来安装CocoaPods,Mac下都自带了ruby,查看是否安装了ruby,使用ruby --version
,如果输出了ruby的版本就表示已经安装了ruby。使用ruby的gem命令即可下载安装CocoaPods:
$ sudo gem install cocoapods
结果,满怀信心期望的我,敲入了这行命令后,一直卡主不动了。原来在我大天朝,官方的ruby源被屏蔽了,也阻挡了cocoapods.org 。
我们可以将官方的ruby源换成国内淘宝的源:
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://ruby.taobao.org/
//验证ruby源是并且仅是taobao源,输入命令:
$ gem sources -l
//在终端输出下面的文字就说明上面的命令执行成功了:
*** CURRENT SOURCES ***
https://ruby.taobao.org
再次输入命令:sudo gem install cocoapods
后,以为这次应该可以了,但是事与愿违,抛出了一下的错误:
ERROR: While executing gem ... (Gem::DependencyError)
Unable to resolve dependencies: cocoapods requires cocoapods-core (= 1.1.1), cocoapods-downloader (< 2.0, >= 1.1.2), cocoapods-trunk (< 2.0, >= 1.1.1), xcodeproj (< 2.0, >= 1.3.3)
原来是因为依赖的环境版本过低需要更新,使用如下命令升级gem:
//升级gem
$ sudo gem update --system
然后一连串的升级信息之后,提示RubyGems system software updated,gem就升级完毕了。在执行安装cocoapods就可以了。
且慢,又出现了如下的错误,真是不省事啊。
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/xcodeproj
原来是在osx10.11(OSX El Capitan)之后(我的是macOS 10.12了),系统阻止了写入/usr/bin目录,而CocoaPods默认是安装到这个目录的。所以我们安装到指定的目录去,如安装到/usr/local/bin:
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
这次终于安装成功了。执行pod setup时会输出Setting up CocoaPods master repo会等比较久的时间。这步操作是CocoaPods在将它的信息下载到~/.cocoapods
目录下。如果等太久,可以cd到那个目录,然后用du -sh *
来查看下载进度。也可以使用CocoaPods的镜像索引来提供下载速度。安装成功后,你会看到:Setup completed。
下载速度过慢会导致下载失败,提示如下信息:
[!] /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
Cloning into 'master'...
fatal: unable to access 'https://github.com/CocoaPods/Specs.git/': SSLRead() return error -9806
所以使用国内的服务器gitcafe和oschina等的CocoaPods索引库的镜像,在执行索引更新操作时会快很多。如下,可以将CocoaPods设置成使用gitcafe镜像:
pod repo remove master
pod repo add master https://gitcafe.com/akuamdev/Specs.git
pod repo update
将上述路径替换成https://coding.net/u/CocoaPods/p/Specs/git 即可使用OSChina上的镜像。但是执行supdate时也不能成功,提示如下错误:
[!] To setup the master specs repo, please run pod setup.
所以只能是手动把索引库clone下来,
git clone https://git.coding.net/CocoaPods/Specs.git ~/.cocoapods/repos/master
pod setup //务必在手动下载代码后执行一次,执行后 Setup completed
//在执行
pod install --verbose --no-repo-update //避免去更新了
使用https clone时有可能不成功,建议在coding.net网站上设置ssh key,然后以ssh的方式去下载,这样会比较快,且较容易成功,我就是这样clone成功的。
setup成功时提示:
CocoaPods 1.2.0.beta.1 is available.
To update use:sudo gem install cocoapods --pre
[!] This is a test version we'd love you to try.
For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.2.0.beta.1
Setup completed
CocaPods的使用
使用时,需要新建一个名为Podfile
(固定名字,无后缀)的文件,也可以进入到项目根目录下,使用pod init
命令来生一个Podfile文件,然后编辑文件,使用vim或者其他编辑工具都行,Podfile文件的格式如下所示:
platform:ios,'9.0' #不写9.0,则默认是最新的系统版本
pod 'JSONKit','~>1.4' #1.4为版本号,不写默认最新版本
pod 'Reachability', '~>3.0.0'
pod 'ASIHTTPRequest'
pod 'AFNetworking','~>2.5.3'
pod 'SDWwebImage', '~>3.7.2'
格式形如:pod '第三库名称' '版本号'
,第三类库的名称一定要写正确,不然有可能安装失败。版本号标识的区别如下:
(>=) 1.0 至少版本为1.0
~> 1.0 兼容1.0版本的最新版
== 1.0或1.0 都表示指定版本
编辑好需要的类库信息后,将文件放到项目的根目录,然后cd进到工程根目录,执行如下命令:
cd "你的工程根目录"
pod install
之后出现pods installed
的提示就表示所有第三方库都已经下载完并设置好了编译参数和依赖。
以前我们的工程不是CocoaPods工程时,是通过*xcodeproj
文件来打开工程的,但使用CocoaPods后会生成一个名为*xcworkspace
文件,我们需要使用这个文件来打开工程了。
当以后我们每次更新了Podfile文件后,都需要重新执行一次pod update
命令。
查找第三方库
可以通过命令pod search
来在CocoaPods管理的库中查找有没有自己想要的库:
//如 查找json相关的可用的库
$ pod search json
会显示出相关可用的库:
-> JSON (5.0.0)
JSON made so simple, it hurts
pod 'JSON', '~> 5.0.0'
- Homepage: https://github.com/3lvis/JSON
- Source: https://github.com/3lvis/JSON.git
- Versions: 5.0.0, 5.0.0-beta1, 4.0.2, 4.0.1, 4.0.0, 3.1.0, 3.0.0, 2.1.1,
2.1.0, 2.0.0 [master repo]
-> json-parser-swift (0.2.0)
JSON parser & tokenizer in pure Swift
pod 'json-parser-swift', '~> 0.2.0' - Homepage: https://github.com/webconnex/json-parser-swift
- Source: https://github.com/webconnex/json-parser-swift.git
- Versions: 0.2.0, 0.1.1, 0.1.0, 0.0.2, 0.0.1 [master repo]
.gitignore的使用
我们都知道,每个git项目都会有个.gitignore
文件,它的作用是告诉Git哪些文件是不需要添加到版本管理中的,也就是在本地库中有,但是push时不会上传到github库中。使用规则如下所示:
- /testDir/ 过滤掉整个文件夹
- *.zip 过滤掉所有的.zip文件
- /testDir/test.c 过滤掉某个具体的文件
能过滤掉某些文件,也可以指定某些文件添加到版本管理中,如:
- !/testDir/test.txt
- !*.zip
就是开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。需要注意的是,要在项目开始时就创建.gitignore文件,否则如果在创建.gitignore之前就push了项目,那么在.gitignore中过滤规则将不会起作用,Git让然会对所有类型的文件进行版本管理。
言归正传,在执行了命令pod install后,会生成Podfile
文件,同时CocoaPods还会生成一个名为Podfile.lock
的文件,不要把这个文件加入到.gitignore中,因为Podfile.lock会锁定当前各依赖库的版本,之后执行多次都不会更改版本,只有执行pod update才会改变Podfile.lock。这样可以防止在第三方库升级时造成团队成员各自的第三方库版本不一致。所以需要总是把Podfile.lock加入版本管理中。
为自己的项目创建podspec文件
我们可以为自己编写的开源项目创建podspec文件,使用一下命令来初始化一个podspec文件:
$ pod spec create my_podspec_name
执行改命令后,CocoaPods将会在本目录生成一个名为my_podspec_name.podspec文件。可以使用编辑器打开该文件,可以看到里面已经有很详细的说明文档。
不更新podspec
CocoaPods执行pod install和pod update会默认先更新一次podspec索引。可以使用一下参数来禁止索引更新操作:
pod install --no-repo-update
pod update --no-repo-update
生成第三方库的帮助文档
可以借助appledoc
来生成第三方库的帮助文档,并集成到Xcode中。类似Java的javadoc,可以为我们生成OC代码注释,并且风格和苹果类库的api文档保存一致。
首先如果没有安装appledoc,使用brew可以安装,执行下面的命令即可:
$ brew install appledoc
执行以上命令时会遇到问题:
/usr/local is not writable. You should change the
ownership and permissions of /usr/local back to your
user account:
sudo chown -R $(whoami) /usr/local
fatal: could not create leading directories of '/usr/local/Library/Taps/homebrew/homebrew-core': Permission denied
使用一下命令
$ sudo chown -R $(whoami) /usr/local
然后再执行安装命令。但执行再执行brew install appledoc就可以了。如果需要update homebrew就执行命令brew update
,最后提示Already up-to-date.就更新成功了。
也可以从github上下载安装:
$ git clone [email protected]:tomaz/appledoc.git
$ cd ./appledoc
$ sudo sh install-apple.sh
使用命令appledoc --version
来验证是否已经成功安装了appledoc。
使用时切换目录到iOS工程目录下,然后使用一下操作:
appledoc -o --project-name --project-company
//输出的目录、项目名称、公司名称。
可以使用 appledoc --help来查看更多使用参数。
CocoaPods的原理
CocoaPods的原理是将所有的第三方依赖库都已target的方式放到一个名为Pods的项目中去,让我们的工程以阿里这个Pods项目,这样,主项目就不需要一个个去管理这些依赖库了,都交由CocoaPods去管理。Pods项目最后会编译生成一个libPods.a
的静态库文件,提供给我们的主项目使用,主项目只需依赖这个.a文件即可。
对于资源文件,CocoaPods提供一个名为Pods-resources.sh
的bash脚本,该脚本项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
CocoaPods通过一个名为Pods.xcconfig
文件来在编译时设置所有的依赖和参数。
原来的工程设置已经被更改,这是我们不能通过直接打开原本的工程文件去编译,只能通过新生成的xcworkspace来进行项目的管理。