CocoaPods的使用

文档更新说明

  • 2018-7-4 v1.0 初稿

 

一、CocoaPods的安装

1.替换ruby源

CocoaPods是基于ruby ecosystem的,需要ruby环境,使用ruby的gem命令。所以我们的系统要有ruby环境。然而Mac系统默认会安装好ruby环境。可在终端ruby -v查看ruby版本:

//查看ruby版本
ruby -v
//输出信息
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]

查看ruby源

gem sources -l

默认情况下,终端会显示下面:

*** CURRENT SOURCES ***
https://rubygems.org/

当然这个源在墙内是访问不到的,所以要更换到ruby-china的镜像

// 1.移除掉原有的源
gem sources --remove https://rubygems.org/
//2.淘宝的源已经不更新维护了,现在使用ruby-china的源哦
gem source -a https://gems.ruby-china.org 以下命令添加淘宝的源:(不建议继续使用) gem sources -a https://ruby.taobao.org/ // 3.验证是否替换成功 gem sources -l

如果显示下面输出就说明正确:

*** CURRENT SOURCES ***
https://gems.ruby-china.org

2.更新升级Gem版本

Gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级Gem,执行下述命令即可:

// 更新升级gem,国内需要切换源
sudo gem update --system

查看gem版本

gem -v 
2.6.14

3.安装CocoaPods

sudo gem install cocoapods// 安装cocoapods

如果error:You don't have write permissions for the /usr/bin directory.

命令改为:

sudo gem install -n /usr/local/bin cocoapods

可以避免 rootless 权限造成的不能读写的问题。

想要卸载CocoaPods

//卸载CocoaPods
sudo gem uninstall cocoapods

更新CocoaPods包

sudo gem update cocoapod

检查Pod是否安装成功

pod --version
1.5.3

4.更新Podspec索引文件

pod初始化

pod setup

#将所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目录下

很久没有使用CocoaPods,在使用之前执行下面这个命令:

pod repo update

#更新仓库(将更新的podspec下载到本地)

#更新podspec索引文件

所有的第三方开源库的Podspec文件都托管在 https://github.com/CocoaPods/Specs

我们需要把这个Podspec文件保存到本地,这样才能让我们使用命令pod search 开源库搜索一个开源库,怎样才能把github上的Podspec文件保存本地呢? 那就是 pod setup 

执行pod setup时,CocoaPods 会将第三方的podspec索引文件更新到本地的~/.cocoapods/repos目录下

  • 如果没有执行过 pod setup,那用户根目录下~找不到.cocoapods/repos目录的,没有创建这个目录。
  • 如果执行 pod setup,并且命令没有执行成功,那么会创建~/.cocoapods/repos目录,只不过目录是空的。
  • 如果执行 pod setup,并且命令执行成功,说明把github上的Podsepc文件更新到本地,那么会创建~/.cocoapods/repos目录,并且repos目录里有一个master目录,这个master目录保存的就是github上所有第三方开源库的Podspec索引文件。

但是第一次执行pod setup时,这个github的Podspec索引文件比较大,有 300M 左右(以后会越来越大的),所以第一次更新时非常慢。可以进去目录~/.cocoapods/repos使用命令 du -sh * 来查看下载文件的大小

 

二、CocoaPods的使用

1.新建Podfile文件

使用时需要在你的项目根目录下新建一个名为Podfile的文件(文件名一定为Podfile,不能更改),将依赖的库名字依次列在文件中即可。

进入到项目路径后,执行下面命令:

pod init

2.编辑Podfile文件

简单的Podfile

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'TestPod' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for TestPod

  pod 'MLeaksFinder'

end

 复杂些的Podfile文件

# Uncomment the next line to define a global platform for your project
platform :ios, '8.0'
inhibit_all_warnings!

def common_pods
  pod 'libwebp', :path => './LocalPods/libwebp'
  pod 'Masonry', :path => './LocalPods/Masonry'
    pod 'SDWebImage', :path => './LocalPods/SDWebImage'
  pod 'SDWebImage/GIF', :path => './LocalPods/SDWebImage'
  pod 'SDWebImage/WebP', :path => './LocalPods/SDWebImage'
  pod 'SDWebImage/MapKit', :path => './LocalPods/SDWebImage'
  
  pod 'MBProgressHUD_V1', :path => './LocalPods/MBProgressHUD_V1'

  pod 'WeakStrongMacro', :path => './LocalPods/WeakStrongMacro'
  pod 'FSProgressHUD', :path => './LocalPods/MBProgressHUD'
  pod 'FSiOSAccess', :path => './LocalPods/FSiOSAccess'
  pod 'KVOController', '~> 1.2.0'
  pod 'DACircularProgress', :path => './LocalPods/DACircularProgress'
end

def third_parts_pods
  pod 'FSAssetUtils', :path => './LocalPods/FSAssetUtils'
    pod 'MJRefresh', :path => './LocalPods/MJRefresh'
  pod 'HLNetWorkReachability', :path => './LocalPods/HLNetWorkReachability'
  pod 'AFNetworking', :path => './LocalPods/AFNetworking'
  pod 'AFNetworking/Serialization', :path => './LocalPods/AFNetworking'
  pod 'AFNetworking/Security', :path => './LocalPods/AFNetworking'
  pod 'AFNetworking/Reachability', :path => './LocalPods/AFNetworking'
  pod 'AFNetworking/NSURLSession', :path => './LocalPods/AFNetworking'
  pod 'AFNetworking/UIKit', :path => './LocalPods/AFNetworking'
  pod 'MergedThirdParties', :path => './LocalPods/MergedThirdParties'
end

def image_picker_pods
  pod 'ALOCenteredButton', :path => './LocalPods/ALOCenteredButton'
pod 'FSImagePickerSharedComponents', :path => './LocalPods/FSImagePickerSharedComponents'
  pod 'QBImagePickerController', :path => './LocalPods/QBImagePicker'
  pod 'MWPhotoBrowser', :path => './LocalPods/MWPhotoBrowser'
end

target 'ThirdParts' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for ThirdParts
  common_pods
  third_parts_pods
  target 'ThirdPartsTests' do
      inherit! :search_paths
      # Pods for testing
  end

end

target 'FSImagePicker' do
  common_pods
  image_picker_pods
  target 'FSImagePickerTests' do
    inherit! :search_paths
  end
end

3.安装依赖库

进入到项目路径后,执行下面命令:

pod install

 pod install命令执行成功后,会看到项目根目录下多出xxx.xcworkspacePodfile.lock文件Pods目录

4.更新第三方库

pod install相似的一个命令就是 pod update。

如果未指定版本的话,pod update将所有第三方框架更新到最新版本。

每次更改了 Podfile 文件,你需要重新执行一次pod update命令。

5.不更新podspec

CocoaPods 在执行pod installpod update时,会默认先更新一次podspec索引。使用 --no-repo-update 参数可以禁止其做索引更新操作。

pod install --no-repo-update
pod update --no-repo-update

6.查找第三方库

你如果不知道 cocoaPods 管理的库中,是否有你想要的库,那么你可以通过 pod search 命令进行查找

pod search json 

#在podspec中搜索json库

7.pod文件和命令说明

  ………………………………………相关文件…………………………………………………

  1. Podfile文件

  项目的第三方库的依赖及项目的基本配置

  2. Podfile.lock文件

  最后一次更新Pods时, 保存所有第三方框架的版本号

  3. pods目录

  保存通过pod install或者pod update下载下来的第三方开源库的源代码

  4. xxx.xcworkspace文件

  重新生成一个工作空间,打开这个工程文件来进行开发

  ………………………………………常用命令…………………………………………………

  1. pod setup
  将所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目录下,更新本地仓库。

  2. pod repo update
  
执行 pod repo update更新本地仓库,本地仓库完成后,即可搜索到指定的第三方库,作用类似pod setup。
  不过这个命令经常不单独调用。比如执行pod setuppod searchpod installpod update都会默认执行pod repo update

  3. pod search xxx
  
查找某一个开源库。查找开源库之前,默认会执行pod repo update指令
  
  4. pod list
  列出所有可用的第三方库.现在已经2.4W+了.还在不断地增长

  5. pod install
  会根据Podfile.lock文件中列举的版本号来安装第三方框架
  如果一开始Podfile.lock文件不存在, 就会按照Podfile文件列举的版本号来安装第三方框架
  安装开源库之前, 默认会执行pod repo update指令
  
  6. pod update
  将所有第三方框架更新到最新版本, 并且创建一个新的Podfile.lock文件
  安装开源库之前,默认会执行pod repo update指令
  也可以具体更新某个单独库:
  pod update WeexSDK
  
  7.pod update 与 pod install区别
pod install一般是你第一次想要为项目添加pod的时候使用的,它同样也使用在你为Podfile文件添加或移除pod库的时候。
  • 每次你运行pod install的时候,都会在Podfile.lock文件里写入你安装的pod的版本号。Podfile.lock文件追踪每一个安装的pod库的版本号,并锁定这些版本号。
  • 当你运行pod install是,它将只解决不在Podfile.lock中的pod库依赖关系 
    • 对于在Podfile.lock文件中的pod库,pod install会只下载Podfile.lock文件中指定的版本(pod ‘xxx’, '~1.0' ),而不会去检查这个库是否有更新的版本。
    • 对于不在Podfile.lock文件中的pod库,pod install会搜索这个pod库在Podfile文件中指定的版本
  • 只有当你想要更新pod库的版本时才使用pod update。update命令并不会理会Podfile.lock中的版本信息。执行后,会重新生成Podfile.lock文件。

8.Podfile的语法解释

  1.platform: iOS, '7.0'

指定了开源库应该被编译在哪个平台以及平台的最低版本
若不指定平台版本,官方文档里写明各平台默认值为iOS:4.3, OS X:10.6, tvOS:9.0, watchOS:2.0

2.inhibit_all_warnings
屏蔽cocoapods库里面的所有警告
如果想屏蔽某pod里面的警告:

pod 'JYCarousel', :inhibit_warnings => true
3.use_frameworks!
使用frameworks动态库替换静态库链接
(1)swift项目cocoapods 默认 use_frameworks!
(2)OC项目cocoapods 默认 #use_frameworks!
 
4. target 'xxxx' do
    ** end**
指定特定Target的依赖库
可以嵌套子Target的依赖库
 
  5.inherit! :search_paths
  明确指定继承于父层的所有pod,默认就是继承的

9.使用私有的pods

我们可以直接指定某一个依赖的podspec,这样就可以使用公司内部的私有库。该方案有利于使企业内部的公共项目支持 CocoaPods。如下是一个示例:

pod 'MyCommon', :podspec => 'https://xxx.com/common/myCommon.podspec'

10.特殊处理

已经存在的 workspace 的 cocoapods 集成
在 podfile 的最后单独的一行 指定(也可以是开始的第一行)

workspace 'MyWorkspace'
# MyWorkspace 可以任意指定。
# 在执行 pod install 的时候 会根据  MyWorkspace 生成 MyWorkspace.xcworkspace 文件。

三、CocoaPods说明

1、第三方库会被编译成.a静态库或者.framwork的动态链接库供我们真正的工程使用。
CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程就放在刚才新生成的Pods目录下。整个第三方库工程会生成一个名称为libPods.a的静态库提供给我们自己的CocoaPodsTest工程使用。
对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中
 
2、我们的工程和第三方库所在的工程会由一个新生成的workspace管理
为了方便我们直观的管理工程和第三方库,CocoaPodsTest工程和Pods工程会被以workspace的形式组织和管理。
 
3、原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错,只能使用新生成的workspace来进行项目管理。
 
4、CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。
 
 

 

CocoaPods官方文档:

CocoaPods Guides

 

参考学习博客:
最新的CocoaPods的使用教程

用CocoaPods做iOS程序的依赖管理

CocoaPods的使用

 

posted @ 2018-07-04 18:14  携手D调  阅读(266)  评论(0编辑  收藏  举报