如何使用cocoapods制作第三方的镜像和静态库

最近有新的项目要开发,除了基础库,整个业务代码全部重写,小伙伴们每天pod install和编译运行的次数非常多,而项目中的库都以源码的形式集成,势必造成编译时间大大加长.开发效率受很大影响.
因此把组件二进制化制作成静态库就呼之欲出了.我一直喜欢研究组件化的东西,但是做起来还是遇到各种问题,有些问题解决了才发现对cocoapods的流程有更加深刻的理解.那么我就说说制作组件的静态库的流程.
我现在的目标是把github的Masonry放到我自己创建的私有库,并且制作成静态库

1,把Masonry从github拷贝到本地

git clone https://github.com/SnapKit/Masonry

image.png

2,在私有云端创建一个空项目

image.png
image.png

3,使用pod package Masonry.podspec命令制作静态库

  • 切换到Masonry目录下 执行pod package Masonry.podspec --force --embedded --no-mangle --exclude-deps(前提要gem install cocoapods-packager)
  • 简单起见,我们先只做iOS平台下的静态库所以要注释掉Masonry.podspec文件中一些描述信息,注释掉所有其他平台的信息这样就只制作iOS平台下的静态库了.
image.png
image.png
image.png
  • 可能出现的报错: 这里面要注意pod package命令会根据spec文件中source指定的地址下载代码打包
image.png
  • 所以先不要着急修改这个地址为第二步你创建的私有项目地址,否则就会报下面的错误.
[!] Error installing Masonry
[!] /usr/bin/git clone https://git.coding.net/codingheew/Masonry.git /var/folders/cb/np76rpl52kqb5r16tp4njgrm0000gn/T/d20171016-26288-z1v7u8 --template= --single-branch --depth 1 --branch 0.7.1

Cloning into '/var/folders/cb/np76rpl52kqb5r16tp4njgrm0000gn/T/d20171016-26288-z1v7u8'...
fatal: unable to access 'https://git.coding.net/codingheew/Masonry.git/': Could not resolve host: git.coding.net
image.png
  • 仔细理解下这个报错也能看出来,pod package首先做的就是去source指定的地址和tag名下载代码,而先改动了spec文件中source地址的话,又没有提交代码到创建的空项目,那么肯定是找不到任何代码的.
  • 当然不改动source地址,去github下载代码那也是挺费力的一件事情.为了让pod package这步是从国内的代码服务器下载代码打包当然是可以的,为了不打断读者的思路,我在写完这个流程后再回过头说下,如何在这一步减少pod package的执行时间.

4,修改spec文件

image.png
  • homepage social_media_url source三个地方的URL都改为第二步创建的项目的地址(homepage social_media_url也可以为其他能访问的地址)
  • vendored_framework的路径指向第三步制作好的静态库地址
  • 继续在Masonry目录下使用pod lib lint命令验证,这个时候是用spec去验证本地Masonry-1.1.0/ios/下Masonry.framework的正确性,通过则表面spec和framework都没有问题
    image.png

5,上传代码到云端私有项目

到目前为止总结几点:1,第二步创建的云端私有项目还是什么都没有.2,而且云端私有项目和本地Masonry项目没有建立关系.3,本地Masonry已经具有静态库和一个描述正确的spec文件.4,接下来需要把本地完好的项目上传到私有云端.

  • 使用git remote set-url建立本地项目和远程项目的联系
image.png
  • 重新打v1.1.0的标签,把静态库包含到v1.1.0标签
图片 1.png
  • git push git push --tags把代码和tag都push到私有云端项目
图片 2.png
  • 远程私有仓库刷新看下,代码和tag都应该有了
图片 3.png
图片 4.png

6,pod spec lint进行远程验证

image.png

这是最后也是最关键的一步,这步的流程也就是cocoapods管理代码的核心流程,具体如下

  • 根据本地的spec描述文件
    特别说明pod spec lint这步其实还是本地spec的描述去验证,所以第4步spec如果vendored_framework写错了,第4步其实是可以通过的,只不过你远程项目中的spec描述是不对的,其他人维护你的项目到了pod spec lint这一步就懵逼了.所以第4步还是要写对了,写错了,就重新修改再按照第5步删掉tag提交代码重新打一次标签)
  • 去source指定的地址和指定tag,拷贝项目
    这里是cocoapods找代码的第一步,对应就是s.source = { :git => 'https://git.coding.net/codingheew/Masonry.git', :tag => "v#{s.version}" }这句描述
  • 再根据vendored_framework的路径去找静态库文件
    这里cocopods找代码的第二步,spec文件中写了vendored_framework就意味着是要以静态库的形式集成代码,所以就最好不要在spec同时有source的描述,即便有也只让source指定.h文件.

事实上通过source和vendored_framework并存可以兼容已经写好的项目中存在大量#import "Masonry.h"的引入方式.这里多费点口舌,解释下,因为source指定了.h文件,cocoapods会把你指定的.h文件都暴露到framework以外,因此别人在导入的时候既可以通过#import "Masonry.h",也可以通过#import <Masonry/Masonry.h>的方式找到你的头文件

7,最后pod repo push把本地的spec文件提交到索引repo

  • 建一个私有索引spec库(如果已经有,直接提交到已有索引库即可)
image.png
  • 这一步不要想的太复杂,索引库就是放Masonry.podspec文件,真的其他什么都没有
  • 再通过pod repo add添加到本地pod repo中,这一步也不要想复杂,就是把一个空项目clone到本地repo路径下,仅此而已
    图片 5.png
image.png
  • 最后一步,切换到Masonry目录下,把spec传到索引库,pod会自动push到远程的索引库
image.png
  • 这步成功,所有的工作就都做完了.看下现在本地索引库和远程索引库的变化
image.png
image.png

8, 如何使用静态库

  • 新建一个test项目在podfile中像下面这样写
image.png
image.png

最后说下第三步中减少pod package的执行时间.只说下思路,不进行截图了,免得对于一些初学者更乱了.
1,修改spec中source地址为项目地址
2,根据第5步提交代码以及tag到远程私有仓库
3,执行pod package Masonry命令
4,在第5步重新打标签需要多一步删除远程v1.1.0标签的步骤具体命令为
git push origin :'v1.1.0'
5,然后再重新commit 重新打标签 提交标签

文章中用到的代码都已开源
私有索引库地址 https://git.coding.net/codingheew/codingSpec.git
私有Masonry库地址 https://coding.net/u/codingheew/p/Masonry/git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容