返回

解决 pod update 无法更新到最新版本的问题

IOS

"pod update" 没更新到最新版本? 别急,我来帮你!

你是不是遇到过这样的情况:pod update 命令执行完,一看,有些库根本没更新到最新版!就像上面这位老兄一样,明明 AFNetworking 最新版是 2.6.3,结果只更新到 2.5.4。 遇到这种问题,抓耳挠腮,却不知道该怎么办。 别担心,今天就来给你支几招,彻底解决这个问题。

一、 为什么 "pod update" 没更新到最新?

原因可能有很多种,常见的有以下几种情况:

  1. Podfile 里的版本限制太死: 你看看你的 Podfile,是不是用了 ~> 这种操作符,并且把版本号写得太具体了。~> 的意思是“大约等于”,它会锁定一个版本范围。例如: 'AFNetworking', '~> 2.0',它会找 2.x.x 里最新的,但绝不会升到 3.x.x。
  2. 本地 Specs 仓库太旧: CocoaPods 有个本地的 Specs 仓库,记录了各个库的版本信息。如果这个仓库太久没更新,它可能不知道某个库已经有了新版本。
  3. 网络原因,导致某些时候访问速度慢,也影响了Cocoapods检查远端
  4. Cache问题: 之前的一些操作导致了本地Cocoapods出现错误.
  5. 多个source仓库 : 某些第三方库的仓库地址比较特殊.

二、 解决办法:逐个击破!

下面针对上面说的几个原因,分别给出解决办法。

1. 修改 Podfile 里的版本限制

  • 去掉版本限制: 最直接的办法,就是把 Podfile 里对库的版本限制去掉。 比如,直接写 pod 'AFNetworking',这样 pod update 就会去找最新版本了。

    # 原来的写法
    pod 'AFNetworking', '~> 2.0'
    
    # 修改后的写法
    pod 'AFNetworking'
    

    但这样也有个问题:万一新版本有重大变化,不兼容老代码怎么办? 所以,一般不建议完全去掉版本限制。

  • 放宽版本限制: 另一个办法是,把版本限制放宽一点。 比如,把 'AFNetworking', '~> 2.0' 改成 'AFNetworking', '~> 2.6',这样就会找 2.6.x 里的最新版。或者改为pod 'AFNetworking', '>= 2.0'

    # 原来的写法
    pod 'AFNetworking', '~> 2.0'
    
    # 修改后的写法
    pod 'AFNetworking', '~> 2.6'
      #或者
      pod 'AFNetworking', '>= 2.0'
    

这种做法相对稳妥一些。 你可以根据自己的情况,选择一个合适的版本范围。

2. 更新本地 Specs 仓库

执行下面的命令,更新本地的 Specs 仓库:

pod repo update

这个命令会从 CocoaPods 的官方 Specs 仓库(或者你配置的其他 Specs 仓库)拉取最新的版本信息。

3. 使用更快的国内镜像源(可选)

有时官方源比较慢。如果遇到网络不好导致无法连接或者速度过慢的情况可以试试国内的镜像源:

  1. 移除官方源 (可选, 也可以不删除, 与国内源一起用):

    pod repo remove master
    
  2. 添加国内镜像源 (选择其中一个):

    • 清华大学源:

      pod repo add tuna https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git
      
    • 上海交通大学源

      pod repo add sjtu https://mirrors.sjtug.sjtu.edu.cn/git/CocoaPods-Specs
      
然后更换`Podfile`文件顶部的 `source`
  如使用清华大学源,可以将
     source 'https://github.com/CocoaPods/Specs.git'
   ```
  改成:
    ```
     source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
   ```

 之后再执行:

 ```bash
 pod repo update
 ```

 如果想换回官方源,只要把 Podfile 里的 `source` 改回去,再执行 `pod repo update` 就行了。

### 4. 清理 CocoaPods 缓存

清理缓存有时候也能解决一些奇怪的问题。可以运行:

```bash
pod cache clean --all

这个命令会删除 CocoaPods 的所有缓存。

5. 组合拳:删除 Pods 目录 和 Podfile.lock 文件

这招比较狠,相当于把 CocoaPods 的所有东西都重置一遍。

  1. 删除 Pods 目录: 这个目录里存放了 CocoaPods 下载的库文件。
  2. 删除 Podfile.lock 文件: 这个文件记录了当前安装的每个库的具体版本。

删除这两个东西之后,再执行 pod install(注意,不是 pod update!),CocoaPods 就会重新下载所有库,并且按照 Podfile 里的最新配置来安装。
通常情况下, pod update 也会起到差不多的作用,但是偶尔也会出现莫名其妙的问题, 这时pod install 会是一个兜底策略。

6.进阶技巧: 指定特定版本

有时候,我们可能不想用最新版,或者想试试某个特定的版本。 可以在 Podfile 里这样写:

pod 'AFNetworking', '2.6.3'

这样就会安装指定的 2.6.3 版本。

7. 安全建议(非必须):

为了避免升级带来的不兼容问题, 最好遵循以下几个原则:

  1. 先看文档: 升级前,先看看库的官方文档或 Changelog,了解新版本有哪些变化。
  2. 小步快跑: 不要一次性升级太多库,也不要一次性跨太大版本。 一步一步来,每次升级一个小版本,并且做好测试。
  3. 版本控制: 使用 Git 等版本控制工具,记录每次升级后的代码。 一旦发现问题,可以快速回滚。

三、实操演练

以AFNetworking从2.5.4更新到最新版(假设目前最新版本是2.7.0, 注意以后操作时查看最新版本)为例:
按照上面操作过的同学应该注意到了之前的版本号,这里我们总结一下:

  1. 查看当前最新版本: 在操作前,需要手动访问AFNetworking的github主页或相关网页查看一下目前的最新版。例如,现在是2.7.0

  2. 更改Podfile

    # 将之前的写法
    pod 'AFNetworking', '~> 2.0'
    
    # 修改为以下任何一种方法都可以
    
    pod 'AFNetworking', '~> 2.7' # 或者 '~> 2.7.0', 如果你确定到小版本的话.
    pod 'AFNetworking'           # 直接指定为最新
    pod 'AFNetworking', '>=2.5.4'
    
  3. 更新依赖,检查效果:

     pod repo update  # 如果用了国内镜像, 可以省略这一步,如果你很长时间没有使用过官方源,为保险可以执行下。
    
    pod update AFNetworking #注意这里如果用update,需要单独指出包的名字。 否则是全局pod
    
      # 或者可以无脑
     pod update
    
    

    然后查看项目是否可以正常编译使用.
    如果不确定, 为了以防万一. 建议在执行上述命令前,把缓存也清除. 即, 执行了:

    pod cache clean --all
    

    如果确定修改好了podfile,可以直接用下列组合拳操作, 一定可以正确更新到指定的或者最新版。

    • 删除pods 目录, 删除Podfile.lock
    • 执行pod install
  4. 重复操作处理其它没有更新到最新的第三方库,如 FBSDKCoreKit,重复步骤1, 23.

  5. 成功后,不要忘记把项目git commit
    以上就是问题的主要解决方案了. 根据我的实践, 以上的方法可以组合使用,根据具体情况去操作即可。