CocoaPods CDN机制中文解析

5,882 阅读4分钟

CocoaPods 1.8.0

CocoaPods 1.8将CDN设为默认的spec repo 源,并进行了一些增强。

CDN
概念

全称:Content Delivery NetworkContent Ddistribute Network,即内容分发网络

基本思路

通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

)

目的

解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度和成功率。

CDN已设为默认值

CDN是cocoapods在1.7版本开始支持的并在1.7.2版本中完成。在1.8版本中不需要再去clone master库了。

Cocoapods-1.8使用
  1. 升级到最新版本

    $ sudo gem install -n /usr/local/bin cocoapods --pre
    
  2. 替换掉原来的source

    # 若podfile中没有
    - source 'https://github.com/CocoaPods/Specs.git' #git 源
    + source 'https://cdn.cocoapods.org/' #cdn源
    
  3. 删除master库

    $ pod repo remove master
    
  4. 查看当前版本(非必须命令)

    # 检测是否为1.8.0版本
    $ pod --version
    
  5. 检测本地是否还包含masterrepo库(非必须命令)

    $ pod repo list
    
  6. 部署pod环境

    $ pod setup
    
  7. 安装三方库

    # 会看到Addomg spec repo 'trunk' with CDN `https://cdn.cocoapods.org/`
    $ pod install
    
trunk库

trunk是CDN支持的主要规格存储库的新名称。因为Cocoapods - 1.8.0后默认使用CDN的。升级到1.8.0及以后,trunk替代了臃肿的master库。

trunk库包含的文件

.txt文件:一组三方库名称及其所有的版本号。这样的文件有很多。

CocoaPods-version.yml文件

CocoaPods-version.yml文件:指定了Cocoapods的版本边界

---
min: 1.0.0
last: 1.8.4
prefix_lengths:
- 1
- 1
- 1
AlgoliaSearch.yml文件

此文件是第一次执行pod search时生成的。此文件为远端对本地生成的身份信息。可以用来加快检索及请求效率。

---
application_id: WBHHAMHYNM
api_key: 4f7544ca8701f9bf2a4e55daff1b09e9
index: cocoapods
ETag文件

Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match.请求一个文件的流程可能如下:ETag文件是一个可以与Web资源相关联的token(资源的身份证)。

第一次请求:客户端发起 HTTP GET 请求一个文件;服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200

第二次请求:客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d044840。服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存

# 此为 CocoaPods-version.yml.etag 对应的
"031c25b97a0aca21900087e355dcf663-ssl"

#####Specs文件夹

此文件中只存储了Podfile的工程中已经下载的三方库的spec文件。并没有过多赘余,所以要比master库小很多。(master库2.52GB,trunk库1.2MB。基于My Mac)

常规操作

执行search必须将master库取消关联,不然还会重新clonemaster库.

$ pod repo remove master
$ pod search MJRefresh

注意:search未使用过的三方库,可能会报错[!] CDN: trunk URL couldn't be downloaded: https://cdn.cocoapods.org/AlgoliaSearch.yml, error: Net::OpenTimeout。使用新三方库时,Cocoapods会去远程库拉取对应的spec文件。原因是第一次使用某个三方库时,Cocoapods回去远端拉取.txt及对应的.txt.etag文件。

podfile中有私有库源,则需要把CDN的源也加进去。

source 'https://git.sprucetec.com/mei***ile/***zation/***ecs.git'
# CDN新源
source 'https://cdn.cocoapods.org/'

替换libwebp文件的源

以前查找libwebp

$ find ~/.cocoapods/repos/master -iname libwebp

现在需要更换路径,执行下面命令

$ find ~/.cocoapods/repos/trunk/Specs -iname libwebp
# /Users/pengge/.cocoapods/repos/trunk/Specs/1/9/2/libwebp
Cocoapods表象上的变化
  1. 第一次安装不需要去下载臃肿的master库了。
  2. 不需要再升级三方库时再去pod repo update了。CDN自动校验了。
注意

cdn在cocoapods中应用还存在一些问题(真的太垃圾了)。某些 podspec.json会被Q。

[!] CDN: trunk URL couldn't be downloaded: https://raw.githubusercontent.com/CocoaPods/Specs/master/Specs/5/f/7/CL_ShanYanSDK/2.2.1.7/CL_ShanYanSDK.podspec.json, error: Failed to open TCP connection to raw.githubusercontent.com:443 (Connection refused - connect(2) for "raw.githubusercontent.com" port 443)

目前的解决思路有三种:

  1. 弃用cdn机制。回退到原来的master repo库的方式。
  2. 多执行几次pod指令,说不定某个时间点它又下载下来了。
  3. 那就是让 shell 翻Q。