【Toki组件化】包含静态包的Pod库

序言

经过长时间的使用实践,发现静态包使用率不高,所以这个解决方案现已弃用。

介绍

考虑到代码编译时间,我在构建组件化过程中引入了静态包方案,即每一个Pod库都支持源码和静态包两种安装方式。
这不但需要修改*.podspec文件来支持,还须要在每次发布前编译静态包。

开发过程变得比较繁琐,为了方便开发,我对官方模版做了一点优化,发布了Pod-Template,还写了一个命令行工具 Pod-Pipeline 来简化发布操作。

Pod-Template介绍

  1. 结构改动
  • 由于我暂时没有进行swift为主的Pod库开发。所以我删掉了模版中的swift内容。
  • 由于我希望Pod库支持静态包。所以我移除了Podfile中的use_frameworks!
  • 由于Pod内容和编译内容较多,且不是必要保存内容。所以在.gitignore文件中添加了Pods/${POD_NAME}-*/两个默认忽略项。
  • 由于静态包的二进制文件无法被Git识别内容变化,每次都直接上传的话会让Git仓库变得很大。所以我引入了Git LFS(Large File Storage),并在项目中添加了.gitattributes 文件。但是须要使用者自己在设备中安装Git LFS,并在项目中执行git lfs install
  1. 通用Pod库的*.podspec中关于资源、代码引用的改动

我们在执行pod install的时候,实际是从本地的pod cache中寻找对应的库进行安装,所以在Spec中必须同时包含源码版本和静态包版本。
我选择使用subspec:SourceModesubspec:FrameworkMode来承载两种版本的内容,并由subspec:Core解析执行pod install时传入的FX=all(或dependency)参数,判断安装时应该使用哪种版本。

Pod::Spec.new do |s|
  
  ...
  
  #静态包模式
  s.subspec 'FrameworkMode' do |fm|
    fm.vendored_frameworks = '${POD_NAME}/${POD_NAME}SDK/*.framework'
    # fm.resource = '${POD_NAME}/${POD_NAME}SDK/*.bundle'
  end

  #源码模式
  s.subspec 'SourceMode' do |sm|
    sm.source_files = [
      '${POD_NAME}/Classes/**/*'
    ]
    sm.public_header_files = [
      '${POD_NAME}/Classes/**/*.h'
    ]
    # sm.resource_bundles = {
    #   '${POD_NAME}' => ['${POD_NAME}/Assets/**/*.png']
    # }
  end

  #核心代码
  s.subspec 'Core' do |core|
    # FX=all pod install; 所有库都使用framework模式安装
    isAllFX = ENV['FX'] == "all" || ENV['${POD_NAME}_FX'] == "all"; 
    # FX=dependency pod install; 依赖库使用framework模式安装
    isDependencyFX = ENV['FX'] == "dependency" || ENV['${POD_NAME}_FX'] == "dependency"; 
    isDependency = !!__FILE__[".cocoapods/repos"];
    if isAllFX || (isDependency && isDependencyFX)
      core.dependency '${POD_NAME}/FrameworkMode'
    else
      core.dependency '${POD_NAME}/SourceMode'
    end

    # core.public_header_files = 'Pod/Classes/**/*.h'
    # core.frameworks = 'UIKit', 'MapKit'
    # core.dependency 'AFNetworking', '~> 2.3'

    # core.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
  end
  s.default_subspec = 'Core'
end
  1. 业务组件Pod库的*.podspec中关于资源、代码引用的改动

由于业务组件之间可能会互相调用对外接口,而并不需要引用完整Pod库。
所以我把对外接口的声明文件(即TKModule+*.h文件)单独封装为subspec:Interface
对外接口的实现内容(即TKModule+*.m文件)依然要添加到subspec:SourceMode
此外,使用者可能并未在本地声明本业务组件的对外接口,所以安装源码版本时应该同时安装subspec:Interface
至于静态包版,它本就是由源码版本编译得来的,所以其中已经包含了对外接口的声明文件。

Pod::Spec.new do |s|
  ...
  
  #源码模式
  s.subspec 'SourceMode' do |sm|
    sm.source_files = [
      '${POD_NAME}/Classes/**/*',
      '${POD_NAME}/Interface/**/*.m'
    ]
    ...
  end

  #对外接口
  s.subspec 'Interface' do |interface|
    interface.source_files = [
      '${POD_NAME}/Interface/**/*.h',
    ]
    interface.public_header_files = [
      '${POD_NAME}/Interface/**/*.h'
    ]
  end

  #核心代码
  s.subspec 'Core' do |core|
    ...
    if isAllFX || (isDependency && isDependencyFX)
      core.dependency '${POD_NAME}/FrameworkMode'
    else
      core.dependency '${POD_NAME}/SourceMode'
      core.dependency '${POD_NAME}/Interface'
    end
    ...
  end
  s.default_subspec = 'Core'
end
  1. 为刚创建的Pod库添加本地配置

通过我的模版创建的Pod库,在进行开发前须要添加一些本地配置。当然也可以使用自己的模版去避免了这些手动操作。

  1. 添加Git仓库的远程映射
$ git@github.com:xxx/xxx.git
  1. 为Git仓库安装Git LFS
$ git lfs install
  1. 修改podspec中的本地配置
Pod::Spec.new do |s|
s.summary          = 'XXX'
s.description      = 'XXXX'
s.homepage         = 'https://github.com/xxx/xxx'
s.source           = { :git => 'https://github.com/xxx/xxx.git', :tag => s.version.to_s }
  1. 在Podfile中添加私有的Specs地址
source 'https://github.com/xxxx/Specs.git'

Pod-Pipeline介绍

该工具整合了Git和CocoaPods的一些功能,可以帮助我更简单地构建和发布项目。

#安装
$ gem install pod-pipeline

Pod-Pipeline和CocoaPods都是基于CLAide(Comand Line aide)实现命令行功能的,所以基本用法是一致的,很容易上手。

$ ppl --help
Usage:

    $ ppl COMMAND

      Pod-Pipeline 是 CocoaPods 的流水线工具.

Commands:

    + build     项目构建
    + new       创建新项目
    + publish   项目发布
    + scan      项目扫描
    + update    项目更新

Options:

    --help      展示改命令的介绍面板

通常用法:

  1. 是在完成需求开发并提交修改后。
  2. 在Demo目录执行pod install,保证Demo对Pod库源码引用正常。
  3. 在Pod目录执行下方命令
$ ppl publish\
 --repo=xxx\
 --build-arch=arm64,armv7\
 --build-combine=local\
 --update-channel=version,git\
 --repo-push-sources=https://github.com/xxxx/Specs.git\
 --repo-push-allow-warnings

第2步中生成的Podfile.lock改动,会在ppl update git命令执行过程中和*.podspec的改动一同提交

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容