CocoaPods 环境安装

优质
小牛编辑
140浏览
2023-12-01

CocoaPods 环境安装

关于CocoaPods

CocoaPods是iOS开发、macOS开发中的包依赖管理工具,效果如Java中的Maven,nodejs的npm。

CocoaPods是一个开源的项目,源码是用ruby写的,源码地址在GitHub上。

无论是做iOS开发还是macOS开发,都不可避免的要使用到一些第三方库,优秀的第三方库能够提升我们的开发效率。如果不使用包依赖管理工具,我们需要手动管理第三方包,包括但不限于:

将这些第三方库的源码拷贝到项目中 第三方库代码有可能依赖一些系统framework,我们需要把第三方库依赖的framework导入到项目中 当第三方库有更新时,需要将更新过的代码拷贝到项目中 以上工作虽然简单,但是如果项目中的第三方库较多,需要耗费大量的时间和精力。CocoaPods可以将我们从这些繁琐的工作中解放出来。

  • CocoaPods 与常规依赖库使用维护操作上的区别

    • 传统模式下, 当我们使用一些三方开源库、SDK(如QQ分享、微信分享)等时, 我们导入类库的方式是:

      1. 下载源码, 拖拽到项目指定目录内; 如果有图片素材,bundle文件等, 也需要手动一同导入; 并且所处项目结构也需要自行管理
      2. 同属同一个project, 通过import "XXX.h"来使用类库
      3. 今后SDK或依赖库升级了, 那我们要先把旧版本删除掉, 导入新版本依赖库
    • 使用了CocoaPods后:

      1. Podfile中通过增加pod '类库名称', '~> 版本号'
      2. 执行pod install完成依赖库的导入
      3. 升级依赖库版本, 只需要修改Podfile中对应依赖库后面的版本号重新执行pod install即可完成
  • 目录结构对比 (左侧是传统模式, 右侧是是用来CocoaPods)
    没有使用包管理器 使用Cocoapods后

  • 对比优势:

    CocoaPods是将所有依赖的第三方库都放到了Pods项目中, 所有的源码管理工作从主项目转移到了Pods项目中。 Pods项目最终会编译成一个libPods-项目名.a的文件,主项目只需要依赖这个.a文件即可。(不同Cocoapods版本以及Poffile配置不同, 也可以转成多个framework) 省去了枯燥无聊的手工操作, 也免去了维护项目目录的烦恼, 全部的依赖库及使用版本清晰明了; 而且主项目中因为减少了依赖库部分, 也会更简洁


影响到整个工具链的安装及更新的主要原因

  1. 系统权限

  2. 版本依赖

  3. 其他环境原因 (非常多, 具体原因可根据不同报错查找解决方案)


环境搭建

1. 准备好梯子(必须), 本次安装各工具版本介绍

工具链版本其他补充
ruby2.6.5rvm 管理版本
RubyGems3.0.8源: https://gems.ruby-china.com/
Cocoapods1.9.3Trunk

2. 检查本地环境:rubyRubyGems

CocoaPodsruby 有版本要求, 目前CocoaPods已经升级到1.9.x版本, 建议同步升级ruby版本 (非强制), 至少不低于2.3.x

  • 检查当前系统下ruby版本, $ ruby -v

    ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

  • 检查当前系统下的RubyGems版本 $ gem -v

    2.5.2.3

检查Ruby和RubyGems版本

3. 升级 rubyRubyGems

非必要但也很关键, MacOS自带rubyRubyGems, 默认版本较低, 如果gem的版本号过低,安装CocoaPods可能会失败

  • 更新RubyGems版本, 更新后通过确认下版本

       sudo gem update -n /usr/local/bin --system
    
  • 安装 rvm, 通过rvm维护ruby版本

       // 安装rvm
       curl -L get.rvm.io | bash -s stable
       // 让环境立即生效
       source ~/.rvm/scripts/rvm
       // 检查确认rvm是否生效
       rvm -v
    

    安装rvm

  • 更新ruby

       // 列出当前可安装的全部版本 (rvm list是查看当前已安装版本)
       rvm list known
       // 安装指定版本, 这里我指定了2.6.5这个版本, 并没有安装最新的2.7.x
       rvm install 2.6.5
       // 设置默认版本
       rvm use 2.1.4 --default
    
  • 更换RubyGems源 (必须, 否则就是持续的失败, 因为国内被墙)

    • RubyGems默认的源 https://rubygems.org/
      国内使用的源有很多, 这里我推荐 `https://gems.ruby-china.com/`
      
    • 更换RubyGems

        // 移除原默认的源
        gem sources -r http://rubygems.org/
        // 添加新源, 切记末尾的/不能缺少
        gem sources -a https://gems.ruby-china.com/
        // 检查下是否已经有且只有 https://gems.ruby-china.com/源
        gem sources
      

      检查RubyGems源

4. 安装 CocoaPods

  • 提前安装好 Xcode, 安装 CocoaPods

     sudo gem install -n /usr/local/bin cocoapods
    
  • 检查版本, 确认安装成功

     pod --version
    

5. 验证并使用 CocoaPods

CocoaPods 1.8.4以前的版本, 在步骤4的最后执行pod setup漫长等待成功后, 就可以正常使用了, 但在1.8.4版本开始做了重大调整

官方说明: CDN as Default, 也可参照链接中视频使用介绍.

  1. 通过 Xcode 新建并进入到项目路径
  2. 执行 $ pod init , 新建 PodFile 文件
  3. 编辑 Podfile后 , 执行 $ pod install 后等待完成依赖库的集成

验证Cocoapods

  • trunkmaster的区别:

    • mater 方式

      指定的源为 https://github.com/CocoaPods/Specs.git
      在安装环境的最后关键环节是pod setup, 会把 CocoaPods 仓库的整个 master 分支拉取到本地

    • trunk方式

      指定的源为 https://cdn.cocoapods.org/
      在安装环境的最后环节免去了漫长的pod setup过程

对比提升:
安装环节: 提速最直观的就是在Cocoapods环境配置环节, 在有梯子的情况下, 至少也是需要半个多小时的等待过程
使用环节: 因为不同的源, 所以在pod install环节的速度也有提升

CocoaPods 基本使用

  • 新建 Xcode项目, CocoaPods 服务于项目, 如果没有项目工程文件, 无法直接使用
  • 进入工程目录, cd.xcodeproj 项目文件同级目录, 执行$ pod init 后生成 Podfile 文件
    Podfile所在路径
  • 通过 Vim 或其他任意文本编辑工具打开 Podfile 文件 (如果使用 VSCode 注意保存)

    • 去掉 # platform :ios, '9.0' 前面的#, 打开注释 , 同时设置与 Xcode 项目相同的最低版本号
    • 添加依赖库
      添加依赖库
    • 安装依赖库, 执行 $ pod install --verbose --no-repo-update, 等待安装结束, 便完成了依赖库的安装
      安装依赖库

典型问题

1. ERROR: While executing gem ... (Errno::EPERM) ... Operation not permitted

CIandCD-iOS:~ admin$ sudo gem update --system
Updating rubygems-update
Fetching: rubygems-update-3.1.4.gem (100%)
Successfully installed rubygems-update-3.1.4
Parsing documentation for rubygems-update-3.1.4
Installing ri documentation for rubygems-update-3.1.4
Installing darkfish documentation for rubygems-update-3.1.4
Done installing documentation for rubygems-update after 63 seconds
Parsing documentation for rubygems-update-3.1.4
Done installing documentation for rubygems-update after 0 seconds
Installing RubyGems 3.1.4
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted @ rb_sysopen - /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/gem

OS X El Capitan v10.11 开始加入了 Rootless 机制, 对权限进行了控制, 默认我们是无法对 usr/bin/ 这个目录进行写权限的

System Integrity Protection

A new security policy that applies to every running process, including privileged code and code that runs out of the sandbox. The policy extends additional protections to components on disk and at run-time, only allowing system binaries to be modified by the system installer and software updates. Code injection and runtime attachments to system binaries are no longer permitted.

在很多安装、更新环节都会遇到ERROR: While executing gem ... (Errno::EPERM)...Operation not permitted ...的错误

解决方案:

  • 修改目录权限

    • SIP 让 /usr/bin 只读了, 但是 /usr/local 是可读可写的, 将安装目录修改了.

    • 关闭SIP(这种方法非常不推荐, 相当于自己关了一层防火墙.)

       csrutil disable
       reboot
      

这也是为什么在前面的环节, 我都是用来 -n 参数指定到了 usr/local/bin路径下

2. [!] Unable to find a pod with name, author, summary, or description matching

执行 $ pod install$ pod search xxx 等命令报错:

[!] Unable to find a pod with name, author, summary, or description matching

多试几次 如果是 master 方式, 删除索引后再试

 rm -rf ~/Library/Caches/CocoaPods/search_index.json

彻底的卸载 CocoaPods

一般情况下需要卸载 Cocoapods 只需要执行 $ sudo gem uninstall cocoapods 即可
但通常情况下我们很少会需要卸载 CocoaPods , 往往是在排查问题无效需要重新部署环境时才会需要这个环节
下面是我在处理 CocoaPods 问题时尝试过最有效的清理方式

1. 移除pod组件

shenyj@ShenYj-MBP ~ % which pod
/usr/local/bin/pod
shenyj@ShenYj-MBP ~ % sudo rm -rf /usr/local/bin/pod

2. 移除 RubyGems 中的 Cocoapods程序包

$ sudo gem uninstall cocoapods

3. 查看本地安装过的Cocoapods相关内容, 并彻底清除

$ gem list --local | grep cocoapods

shenyj@ShenYj-MBP ~ % gem list --local | grep cocoapods
cocoapods-core (1.9.1)
cocoapods-deintegrate (1.0.4)
cocoapods-downloader (1.3.0)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.1.0)
cocoapods-trunk (1.4.1)
cocoapods-try (1.2.0)

4. 然后逐个删除

shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-core
Successfully uninstalled cocoapods-core-1.9.1
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-deintegrate
Successfully uninstalled cocoapods-deintegrate-1.0.4
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-downloader
Successfully uninstalled cocoapods-downloader-1.3.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-plugins
Successfully uninstalled cocoapods-plugins-1.0.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-search
Successfully uninstalled cocoapods-search-1.0.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-stats
Successfully uninstalled cocoapods-stats-1.1.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-trunk
Successfully uninstalled cocoapods-trunk-1.4.1
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-try
Successfully uninstalled cocoapods-try-1.2.0

podfilepodfile.lock文件

  • Podfile.lock 文件

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

  • Pod 常用指令区别

    • $ pod install

      • 如果Podfile.lock文件不存在,会根据Podfile文件安装第三方框架,并生成Podfile.lock文件
      • 如果Podfile.lock文件存在,会根据Podfile.lock文件的版本号来安装第三方框架
    • $ pod update

      • 根据Podfile文件安装第三方框架
      • 将所有第三方框架更新到最新版本,并且创建一个Podfile.lock文件覆盖掉原文件
    • $ pod install/update --verbose --no-repo-update

      • 安装框架前不会执行pod repo update,意味着不去检查服务器版本,直接使用本地缓存的框架版本

      help.png

  • pod install过程简述

    • 在通过pod installpod update指令安装框架前,都会先执行pod repo update指令,将服务器最新的框架下载到本地,项目中是否安装最新版本的框架,取决于安装方式:pod install(指定版本)pod update(最新版本)
    • 在第一次执行pod install指令时,podfile.lock还不存在,会根据podfile中的说明来集成框架 如果指定框架版本号,安装指定版本,如果未指定,安装最新的,并自动生成podfile.lock文件
    • 当以后再次执行pod install指令时,会根据podfile.lock中记录的框架版本号来安装框架. 即便服务器中有最新的版本,通过pod install指令也不会安装最新的第三方框架,只会根据podfile.lock中记录的版本来安装
  • 项目中的运用

    • 多人协同开发中,在设置忽略文件时,我们通常不会将pods文件夹每次都推送至服务器,这样会造成服务器资源浪费,通常会将Pods文件夹忽略掉 忽略Pods文件夹

    • 当需要从另外一台电脑上clone项目协作开发时,根据podfile.lock指定的框架版本号,通过pod install指令安装框架,这样可以保证每个人项目中的框架版本都是一致,不会引起冲突

使用忽略文件细节

协作开发中,我们都会配置忽略文件,github为我们提供了各种语言的忽略文件,只需要下载使用即可,但默认项目中的所有内容都被提交到服务器上了,包括第三方框架

第三方框架会不断的更新,每次版本更新随着我们提交代码就会被再次提交到服务器,会造成服务器资源浪费,而项目中的Pods中存放着所有项目中的第三方框架,这些使我们不需要每次都提交的,所以如果你使用的是github上下载的忽略文件,还需要手动配置一下

通过Xcode打开.gitignore文件

忽略Pods.png

这里代表Pods中的内容全部都要备份到服务器上,现在我们是需要取消Pods的备份只需要去掉第36Pods/前面的"#"号即可

  # CocoaPods
  #
  # We recommend against adding the Pods directory to your .gitignore. However
  # you should judge for yourself, the pros and cons are mentioned at:
  # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
  #
  Pods/

设置好后,如果显示隐藏文件,直接重命名忽略文件,去掉文件名即可;如果没有显示隐藏文件,可以通过终端设置

  1. 打开终端
  2. 进度项目路径
  3. 输入命令

    mv Objective-C.gitignore .gitignore
    

    这样项目中的Pods中的文件就不再被提交了

    注意点:

    这种方式设置后,当其他人从服务器中下载了项目后,是没有Pods目录的,需要自己在本地执行pod install 并且最好不要加--no-repo-update参数 这样才能保证每次获取最新的框架