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

    CocoaPods的安装使用和常见问题_第1张图片

    按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退出并保存。

    CocoaPods的安装使用和常见问题_第2张图片

  • 安装第三方库
    $ 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 #. 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之间多了一个空格


    CocoaPods的安装使用和常见问题_第3张图片
  • 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官方使用指南

你可能感兴趣的:(CocoaPods的安装使用和常见问题)