微信号:gh_37ebe37722aa

介绍:txx的笔记分享

I have a pod, I have a cartha

2017-01-15 13:32 txx

前言

这是 OpenCV 系列的第一篇文章,但是和 OpenCV 内容无关,起因是我在安装 OpenCV 的时候被大开眼界了一下。

现象

我当初用 Cocoapods 安装 OpenCV 2.4.12.3 这个版本,注意不是最新版的 OpenCV 3,因为我对 2 的 API 相对熟悉一些。

结果,结果,一个小时过去了…(retina macbook 13 2015 early 实测)

开始以为是我的网络问题,git clone,比较慢。本着严谨踏实的科研态度,我就清掉了缓存,打开 log,打开全局代理,重新 pod install 一次。

然后,又一个小时过去了….

不过收获了一大堆编译 Log,我发现 OpenCV 的 repo 里面是源码,但我 Pod install 之后是 framework。瞬间觉得非常神奇,就去 pod spec 仓库里面一探究竟。

{
  "name": "OpenCV",
  "version": "2.4.12.3",
  "source": {    "git": "https://github.com/Itseez/opencv.git",    "tag": "2.4.12.3"  },
  "prepare_command": "/usr/bin/python platforms/ios/build_framework.py ios && lipo -create `find ios/build -type f -name liblibjpeg.a` -o ios/liblibjpeg.a"}

删掉了一些配置后,大家可以注意最后一行的 prepare_commnad,这个 podspec 里非常不常见的参数。他居然在 pod install 之前,调用了 python!在 git 的对应目录可以看到如下场景:


所以大概是这样的:

  • 先 pod install 来 clone 代码

  • prepare_command 执行 build.py,类似于编译开源项目时常见的 ./configure

  • build.py 调用 cmake,把 OpenCV 代码编译成 iOS Framework

  • prepare_command 结束后,由 Cocoapods 把 framework 插入 Xcode 工程中

这样做的好处是 OpenCV 一次编译,之后怎么 clean 都无所谓了,和我们之前提到的 iOS 编译加速 异曲同工。区别是之前的解决方案是中心化的,而这次的方案是去中心化分布式的。

于是我们是不是可以照猫画虎,做一个出来?这样就不需要那么大的成本开发 CI 系统了,只需要写好各种 podspec 的编译脚本。

Cocoapods + Carthage

把代码编译成 .a 的方法,我们之前的文章讲过了,这里不再提,于是我换个奇葩的,直接用 Carthage。Carthage 是一次性编译成 framework,然后需要开发者自己管理,把它丢入工程。简洁优雅,但是缺乏工作流。

这里我们用最简单的 Mantle 来举例

首先,先把 prepare_command 的部分写好,我选择了 ruby 来做:

p "make up cartfile"
File.write("Cartfile", 'github "Mantle/Mantle"') # 生成一个叫 Cartfile 的文件,让里面写入后面的字符串
p "carthage update"`carthage update` # 安装编译
p "carthage update finish"

然后,我把这个文件推入了 Git, 并魔改一下 Mantle 的 Podfile:

{
  "name": "Mantle",
  "version": "2.1.0",
  "summary": "Model framework for Cocoa and Cocoa Touch.",
  "homepage": "https://github.com/Mantle/Mantle",
  "license": "MIT",
  "authors": "txx",
  "source": {
      "git": "git@ghe.liwushuo.com:txx/PPAP.git"
  },
  "platforms": {
    "ios": "5.0"
  },
  "requires_arc": true,
  "frameworks": "Foundation",
  "vendored_frameworks": "Carthage/Build/iOS/Mantle.framework",
  "prepare_command": "/usr/bin/ruby mantle_build.rb"
}

具体修改点为:

  1. Source 的 git 改为了编译脚本所在的位置

  2. 把代码引用删除,换成了 vendored_frameworks

  3. prepare_command 调用 ruby 编译脚本。

最后,Pod install,完成!

 
糖炒小虾 更多文章 Tweak With Mac QQ II Tweak With Mac QQ I Tweak With Mac QQ I I have a pod, I have a cartha I have a pod, I have a cartha
猜您喜欢 一起脱去小程序的外套和内衣 - 微信小程序架构解析 R语言推出实时技术支持项目 Apache顶级项目系列介绍-1 访谈|信息安全在线教育的难点与对策 【鹅厂网事】走进腾讯公网传输系统