最近有新的项目要开发,除了基础库,整个业务代码全部重写,小伙伴们每天pod install和编译运行的次数非常多,而项目中的库都以源码的形式集成,势必造成编译时间大大加长.开发效率受很大影响.
因此把组件二进制化制作成静态库就呼之欲出了.我一直喜欢研究组件化的东西,但是做起来还是遇到各种问题,有些问题解决了才发现对cocoapods的流程有更加深刻的理解.那么我就说说制作组件的静态库的流程.
我现在的目标是把github的Masonry放到我自己创建的私有库,并且制作成静态库
1,把Masonry从github拷贝到本地
git clone https://github.com/SnapKit/Masonry
2,在私有云端创建一个空项目
3,使用pod package Masonry.podspec
命令制作静态库
- 切换到Masonry目录下 执行
pod package Masonry.podspec --force --embedded --no-mangle --exclude-deps
(前提要gem install cocoapods-packager) - 简单起见,我们先只做iOS平台下的静态库所以要注释掉Masonry.podspec文件中一些描述信息,注释掉所有其他平台的信息这样就只制作iOS平台下的静态库了.
- 可能出现的报错: 这里面要注意pod package命令会根据spec文件中source指定的地址下载代码打包
- 所以先不要着急修改这个地址为第二步你创建的私有项目地址,否则就会报下面的错误.
[!] 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
- 仔细理解下这个报错也能看出来,pod package首先做的就是去source指定的地址和tag名下载代码,而先改动了spec文件中source地址的话,又没有提交代码到创建的空项目,那么肯定是找不到任何代码的.
- 当然不改动source地址,去github下载代码那也是挺费力的一件事情.为了让pod package这步是从国内的代码服务器下载代码打包当然是可以的,为了不打断读者的思路,我在写完这个流程后再回过头说下,如何在这一步减少pod package的执行时间.
4,修改spec文件
- 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都没有问题
5,上传代码到云端私有项目
到目前为止总结几点:1,第二步创建的云端私有项目还是什么都没有.2,而且云端私有项目和本地Masonry项目没有建立关系.3,本地Masonry已经具有静态库和一个描述正确的spec文件.4,接下来需要把本地完好的项目上传到私有云端.
- 使用
git remote set-url
建立本地项目和远程项目的联系
- 重新打v1.1.0的标签,把静态库包含到v1.1.0标签
-
git push
git push --tags
把代码和tag都push到私有云端项目
- 远程私有仓库刷新看下,代码和tag都应该有了
6,pod spec lint
进行远程验证
这是最后也是最关键的一步,这步的流程也就是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库(如果已经有,直接提交到已有索引库即可)
- 这一步不要想的太复杂,索引库就是放Masonry.podspec文件,真的其他什么都没有
- 再通过
pod repo add
添加到本地pod repo中,这一步也不要想复杂,就是把一个空项目clone到本地repo路径下,仅此而已
- 最后一步,切换到Masonry目录下,把spec传到索引库,pod会自动push到远程的索引库
- 这步成功,所有的工作就都做完了.看下现在本地索引库和远程索引库的变化
8, 如何使用静态库
- 新建一个test项目在podfile中像下面这样写
最后说下第三步中减少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