CocoaPods的安装使用和常见问题

一、什么是CocoaPods

CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第三方开源库的时间。在使用CocoaPods之前,开发项目需要用到第三方开源库的时候,我们需要1.把开源库的源代码复制到项目中2.添加一些依赖框架和动态库3.设置-ObjC,-fno-objc-arc等参数4.管理他们的更新在使用CocoaPods后,我们只需要把用到的开源库放到一个名为Podfile的文件中,然后执行pod install.Cocoapods就会自动将这些第三方开源库的源码下载下来,并且为我们的工程设置好响应的系统依赖和编译参数。

二、CocoaPods的原理

CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。

三、CocoaPods的安装与更新

CocoaPods可以通过Mac自带的RubyGems进行安装与更新。
打开Terminal,然后键入以下命令:$ sudo gem install -n /usr/local/bin cocoapods
执行完如果报以下错误:

ERROR: Could not find a valid gem 'cocoapods' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - Errno::ETIMEDOUT: Operation timed out - connect(2)
ERROR: Possible alternatives: cocoa pods

是因为ruby的软件源rubygems.org使用的亚马逊云服务,被我天朝屏蔽了,需要更新一下ruby的源,过程如下:

$ gem sources -l    //查看当前ruby的源
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://gems.ruby-china.org
$ gem sources -l

接下来用$ sudo gem update --system命令升级gem。若报错

Operation not permitted - /usr/bin/update_rubygems

尝试命令$ brew install ruby
直到出现🍺 /usr/local/Cellar/ruby/2.2.3: 1080 files, 20M, built in 3.3 minutes
再次输入$ sudo gem update --system升级gem,成功后提示:

RubyGems system software updated

然后重新执行命令 $ sudo gem install -n /usr/local/bin cocoapods
如果初次安装,还需执行:$ pod setup 把最新的类库信息拉取到本地spec文件。Terminal会停留在 Setting up CocoaPods master repo 这个状态一段时间,需要耐心等待。安装成功后,你会看到:

Setup completed

四、Cocoapods的使用

  • 查看pod版本
    $ pod --version

  • 查找第三方库
    $ pod search AFNetworking


    按q即可退出。
    如果搜索不到:
    1、请先进行:$ pod setup
    2、再清空一下搜索索引,让pod重建索引:
    $ rm ~/Library/Caches/CocoaPods/search_index.json
    这是因为之前pod search的时候生成了缓存文件search_index.json

  • 创建Podfile文件
    cd到工程根目录下,输入$ vim Podfile创建文件。按i进入插入模式,输入文本,按esc进入命令模式后,按:wq或ZZ退出并保存。

  • 安装第三方库
    $ pod install
    1.成功后需要使用Cocoapods生成的 .xcworkspace文件来打开工程,而不是使用以前的.xcodeproj文件
    2.执行之后,除了Podile,还会生成一个名为Podfile.lock的文件,它会锁定当前各依赖库的版本。之后即使多次执行$ pod install也不会更改版本,只有执行pod update才会改变Podfile.lock。在多人协作的时候,这样可以防止第三方库升级时候造成大家各自的第三方库版本不一致。所以在提交版本的时候不能把它落下,也不要添加到.gitignore中
    3.每次更改了Podfile文件,都需要重新执行一次$ pod update命令

  • 卸载pod
    1.$ which pod 查看pod所在路径 比如 /usr/local/bin/pod
    2.$ rm -rf /usr/local/bin/pod
    3.$ gem list | grep cocoapods

cocoapods (1.0.1)
cocoapods-core (1.0.1, 0.39.0, 0.38.2, 0.38.1, 0.37.2)
cocoapods-deintegrate (1.0.0)
cocoapods-downloader (1.1.0, 0.9.3, 0.9.1)
cocoapods-plugins (1.0.0, 0.4.2)
cocoapods-search (1.0.0, 0.1.0)
cocoapods-stats (1.0.0, 0.6.2, 0.5.3)
cocoapods-trunk (1.0.0, 0.6.4, 0.6.1)
cocoapods-try (1.1.0, 0.5.1, 0.4.5)

4.$ sudo gem uninstall xxx

$ sudo gem uninstall cocoapods
$ sudo gem uninstall cocoapods-core
$ sudo gem uninstall cocoapods-deintegrate
$ sudo gem uninstall cocoapods-downloader
$ sudo gem uninstall cocoapods-plugins
$ sudo gem uninstall cocoapods-search
$ sudo gem uninstall cocoapods-stats
$ sudo gem uninstall cocoapods-trunk
$ sudo gem uninstall cocoapods-try

五、常见问题

  • [!] Invalid Podfile file: undefined local variable or method `en_US' for #<Pod::Podfile:0x00000102a5d8b0>. Updating CocoaPods might fix the issue.
    原因:单引号格式,可能是手动输入导致
    解决办法:系统偏好设置-键盘-文本-将“使用智能引号和破折号”一项取消勾选-再将podfile里面的单(双)引号修改一下

  • [!] The YMTea [Release] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation
    原因:项目 Target 中做了一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成问题
    解决方法:想要使用 CocoaPods 中的设置,分别在项目中定义PODS_ROOT 和 Other Linker Flags的地方(build settings),把他们的值用$(inherited)替换掉,进入终端,执行 $ pod update

  • [!] Oh no, an error occurred.
    It appears to have originated from your Podfile at line 2.
    原因:Podfile文件里面 platform 那一行 冒号和ios之间多了一个空格


  • The dependency **** is not used in any concrete target.
    原因:cocoapods升级为1.0以后,Podfile文件书写格式的问题

  • CocoaPods管理的第三方库头文件无法自动补齐问题
    解决办法:
    Target -> Build Settings ,User Header Search Paths条目中,添加${SRCROOT}或者$(PODS_ROOT),并且选择Recursive,递归搜索,然后就可以自动补齐了。

  • framework not found Pods_ChainsProject
    解决办法:
    在终端cd到工程目录下执行以下命令
    1 . pod deintegrate
    2 . pod install

高级用法

  • 指定源
    CocoaPods支持私有 Spec 仓库的,我们可以建立自己的源,也可以使用非官方的源,只要是符合规定的都可以指定。
    source 'https://github.com/artsy/Specs.git'
    source 'https://github.com/CocoaPods/Specs.git'

  • 抑制警告
    inhibit_warnings参数能够有效的抑制CocoaPods引入的第三方代码库产生的warning。
    inhibit_all_warnings! 全部指定
    pod 'ReactiveCocoa', '~> 2.4', :inhibit_warnings => true 针对指定。
    pod 'ISO8601DateFormatter', :head 使用git的HEAD指向的分支
    pod 'ARAnalytics/Mixpanel', :git => 'https://github.com/orta/ARAnalytics.git' 使用 master 分支
    pod 'Reachability', :git => 'https://github.com/ashfurrow/Reachability.git', :branch => 'frameworks' 指定branch
    pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0' 指定tag
    pod 'ARTiledImageView', :git => 'https://github.com/dblockARTiledImageView', :commit => '1a31b864d1d56b1aaed0816c10bb55cf2e078bb8' 指定commit

  • 使用子库
    pod 'QueryKit/Attribute'
    pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet'] 指定多个子库

  • 使用本地代码
    pod 'AFNetworking', :path => '~/Documents/AFNetworking'
    通过:path可以指定本地代码,不过需要确保目录包含podspec文件。

  • 指定target的依赖库

target :ZipApp do   
    pod 'SSZipArchive' 
end  
  • 排除taget
target 'Artsy Tests', :exclusive => true do
    pod 'FBSnapshotTestCase', '1.4' 
end
  • 指定连接的target
    如果不显式指定连接的target,Pods会默认连接project的第一个target。如果需要,可以使用link_with指定连接一个或多个target
link_with 'MyApp', 'MyOtherApp'   
  • 指定环境
    如下只会在Debug环境下面加入PonyDebugger库到工程。
pod 'PonyDebugger', :configuration => ['Debug']
  • 指定target的配置文件
xcodeproj 'TestProject', 'Mac App Store' => :release, 'Test' => :debug  
  • 使用Dynamic Frameworks代替Static Libraries
    通过标志use_frameworks!可开启这个功能。如果需要使用Swift的库,就必须加上这个标志了。

  • 加快pod install/update 速度
    使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update很多时候都卡在了Analyzing dependencies不动,这是更新本地的pod spec索引文件导致的。通过--no-repo-update标志可以不更新本地pod spec索引。当然首次install不应该添加这个标志,后续修改Podfile的时候可以适当使用,加快pod速度。

pod install --no-repo-update   
pod update --no-repo-update  
  • 输出详细日志
    pod update --verbose

CocoaPods Mac App
CocoaPods官方使用指南

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容