iOS 開發時, cocoapods(後簡稱 pod) 是很經常使用的工具css
咱們偶爾也會本身開發 pod 庫並上傳到 pod 上python
pod 的源碼支持多種來源, 本地 path git http 等ios
通常來講, 若是是純開源庫, 咱們直接把源碼上傳到 github , 而後使用 git 依賴便可c++
可是這有一個問題, github 的速度在中國大陸並不快, 咱們有沒有辦法加速它呢?git
這時候通過搜索, jsdelivr 出如今了搜索引擎裏, 號稱國內外均可用的cdn, 我用wget測試了一下, 10M/s的速度仍是能保持的github
這東西自己最初目的是爲了加速 js/css 的訪問json
可是, 上面也說了, 支持"任何"在 github 上的倉庫, 很好, 我就喜歡這樣的東西api
文檔上說支持全部 ref 做爲版本號, 然而不是, 我這裏測試只支持 tag/releasebash
個人目的是爲了給 flutter_ijkplayer 的 iOS 倉庫找一個下載地址, ijkplayer 的 iOS 部分很大, 我打包完有 150M, 用了 xz 壓縮方案讓包變成了 35Mide
但 jsdelivr 有兩個限制: 單文件不能大於 20M, 倉庫的某版本不能大於 50M, 那這裏就有問題了, 個人 xz 是 35M, 超過限制了, 這裏我就要找解決方案了
首先是分拆, 這個好說, macOS 的 split 命令就支持
那合併呢? cat 命令就能夠了
但怎麼在 pod 中作呢, 我搜了一下 podspec 的語法, 發現能夠配置 prepare_command 參數, 這個參數在安裝時會被使用, 而且使用完畢後纔會校驗庫是否存在
咱們能夠在這一步中來作真實的下載和合並操做
有了完整思路, 我要開始着手實施了
前提: 假設我本地有一個 framework.tar.xz, 這個是已經打包好的庫文件
split -b 10m IJKMediaFramework.tar.xz IJKMediaFramework.tar.xz.
複製代碼
這裏要注意最後一個參數最後有一個. 這樣就能完成拆分
ll IJKMediaFramework.tar.xz*
-rw-r--r-- 1 caijinglong staff 33M 3 18 11:34 IJKMediaFramework.tar.xz
-rw-r--r-- 1 caijinglong staff 10M 3 18 11:34 IJKMediaFramework.tar.xz.aa
-rw-r--r-- 1 caijinglong staff 10M 3 18 11:34 IJKMediaFramework.tar.xz.ab
-rw-r--r-- 1 caijinglong staff 10M 3 18 11:34 IJKMediaFramework.tar.xz.ac
-rw-r--r-- 1 caijinglong staff 3.0M 3 18 11:34 IJKMediaFramework.tar.xz.ad
複製代碼
cat IJKMediaFramework.tar.xz.* > IJKMediaFramework-Test.tar.xz
ll IJKMediaFramework-Test.tar.xz
-rw-r--r-- 1 caijinglong staff 33M 3 18 13:58 IJKMediaFramework-Test.tar.xz
複製代碼
這裏大小是 ok 的. 再解壓一下試試
mkdir test
mv IJKMediaFramework-Test.tar.xz test
cd test
tar xvf IJKMediaFramework-Test.tar.xz
ll
drwxr-xr-x 7 caijinglong staff 224B 3 18 11:33 IJKMediaFramework.framework
-rw-r--r-- 1 caijinglong staff 1.0K 3 18 11:33 LICENSE
ll IJKMediaFramework.framework
total 295944
drwxr-xr-x 14 caijinglong staff 448B 3 18 11:33 Headers
-rw-r--r-- 1 caijinglong staff 130M 3 18 11:33 IJKMediaFramework
-rw-r--r-- 1 caijinglong staff 757B 3 18 11:33 Info.plist
drwxr-xr-x 3 caijinglong staff 96B 3 18 11:33 Modules
drwxr-xr-x 4 caijinglong staff 128B 3 18 11:33 libyuv
複製代碼
解壓縮也成功了, 接着就是編寫腳本了
我建立了一個 cat.sh 腳本
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.aa
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.ab
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.ac
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.ad
cat IJKMediaFramework.tar.xz.* > IJKMediaFramework.tar.xz
tar xvf IJKMediaFramework.tar.xz
rm IJKMediaFramework.tar.xz.* IJKMediaFramework.tar.xz
複製代碼
這個腳本會完成下載, 鏈接, 解壓, 刪除壓縮包的過程, 這樣剩餘的就是乾淨的文件了, 只包含 Framework LICENSE README
這裏根據你本身的狀況選擇上傳方式, 我是用的 python 腳本配合 github 的 rest v3 api 上傳的, 你能夠用 git 或者 gihtub 的網頁端 接着有一步很重要的步驟, release 這個版本, 否則 jsdelivr 找不到
個人腳本地址: gitee.com/kikt/ijkpla… 須要配置兩個環境變量 一個是版本號 一個是 GITHUB_TOKEN, 固然若是想要用的話, 仍是須要其餘修改的, 好比倉庫名, 擁有者名等等信息
Pod::Spec.new do |spec|
version = "0.2.2"
spec.name = "FlutterIJK"
spec.version = "#{version}"
spec.summary = "IJKPlayer for Flutter."
spec.description = <<-DESC IJKPlayer for flutter DESC
spec.homepage = "https://github.com/CaiJingLong/flutter_ijkplayer_pod"
spec.license = { :type => 'MIT', :file =>'LICENSE' }
spec.author = { "Caijinglong" => "cjl_spy@163.com" }
spec.source = { :http => "https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@#{version}/README.tar.gz"}
spec.vendored_frameworks = 'IJKMediaFramework.framework'
spec.frameworks = "AudioToolbox", "AVFoundation", "CoreGraphics", "CoreMedia", "CoreVideo", "MobileCoreServices", "OpenGLES", "QuartzCore", "VideoToolbox", "Foundation", "UIKit", "MediaPlayer"
spec.libraries = "bz2", "z", "stdc++"
spec.platform = :ios
spec.ios.deployment_target = '8.0'
spec.requires_arc = true
spec.prepare_command = <<-CMD sh cat.sh CMD
end
複製代碼
這樣在 pod install 的過程當中會完成以下步驟
https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@#{version}/README.tar.gz
文件 version 是字符串插值的版本號trunk, 也就是上傳的信息:
Updating spec repo `trunk`
CDN: trunk Relative path: deprecated_podspecs.txt modified during this run! Returning local
CDN: trunk Going to update 15 files
CDN: trunk Relative path: all_pods_versions_1_1_5.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_4_9_1.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_1_1_7.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_5_d_c.txt modified during this run! Returning local
CDN: trunk Relative path: AlgoliaSearch.yml modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_e_9_d.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_2_1_1.txt modified during this run! Returning local
CDN: trunk Relative path: CocoaPods-version.yml modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_7_f_a.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_d_6_9.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_6_0_4.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_f_4_e.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_8_d_3.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_1_9_2.txt modified during this run! Returning local
CDN: trunk Relative path: all_pods_versions_c_e_7.txt modified during this run! Returning local
- Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/48458c6e0cf376dcb2c374f6b349b960fefa883c/Specs/4/9/1/FlutterIJK/0.2.2/FlutterIJK.podspec.json
- Log messages:
- March 17th, 21:06: Push for `FlutterIJK 0.2.2' initiated.
- March 17th, 21:06: Push for `FlutterIJK 0.2.2' has been pushed (0.922508893 s).
複製代碼
這樣就完成了發包的全過程
下面是發包時的目錄結構
tree output/
output/
├── IJKMediaFramework.framework
│ ├── Headers
│ │ ├── IJKAVMoviePlayerController.h
│ │ ├── IJKFFMonitor.h
│ │ ├── IJKFFMoviePlayerController.h
│ │ ├── IJKFFOptions.h
│ │ ├── IJKKVOController.h
│ │ ├── IJKMPMoviePlayerController.h
│ │ ├── IJKMediaFramework.h
│ │ ├── IJKMediaModule.h
│ │ ├── IJKMediaPlayback.h
│ │ ├── IJKMediaPlayer.h
│ │ ├── IJKNotificationManager.h
│ │ └── IJKSDLGLViewProtocol.h
│ ├── IJKMediaFramework
│ ├── Info.plist
│ ├── Modules
│ │ └── module.modulemap
│ └── libyuv
│ ├── include
│ │ ├── libyuv
│ │ │ ├── basic_types.h
│ │ │ ├── compare.h
│ │ │ ├── compare_row.h
│ │ │ ├── convert.h
│ │ │ ├── convert_argb.h
│ │ │ ├── convert_from.h
│ │ │ ├── convert_from_argb.h
│ │ │ ├── cpu_id.h
│ │ │ ├── macros_msa.h
│ │ │ ├── mjpeg_decoder.h
│ │ │ ├── planar_functions.h
│ │ │ ├── rotate.h
│ │ │ ├── rotate_argb.h
│ │ │ ├── rotate_row.h
│ │ │ ├── row.h
│ │ │ ├── scale.h
│ │ │ ├── scale_argb.h
│ │ │ ├── scale_row.h
│ │ │ ├── version.h
│ │ │ └── video_common.h
│ │ └── libyuv.h
│ └── lib
│ └── libyuv.a
├── IJKMediaFramework.tar.xz
├── IJKMediaFramework.tar.xz.aa
├── IJKMediaFramework.tar.xz.ab
├── IJKMediaFramework.tar.xz.ac
├── IJKMediaFramework.tar.xz.ad
├── LICENSE
├── README.md
├── README.tar.gz
├── cat.sh
└── files
複製代碼
另外, 個人項目中, 我還編寫了一個 lipo 腳本, 用於合併產物, 分割文件, 調用上傳的 python
本篇沒有單獨的倉庫, 可是能夠參考 gitee.com/kikt/ijkpla… 來做爲入口看整個過程
以上