iOS CocoaPods组件平滑二进制化解决方案及详细教程1

[中文教程]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看212 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 212|回复: 1
收起左侧

[中文教程] iOS CocoaPods组件平滑二进制化解决方案及详细教程1

[复制链接]
代码买卖 发表于 2016-7-27 06:15:11 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑
1、什么是组件二进制化?

在iOS开发中,事实标准是我们使用CocoaPods生成、管理和使用library。这里的library就是一个模块、组件或库。二进制化指的是通过编译把组件的源码转换成静态库或动态库,以提高该组件在App项目中的编译速度。

我们的方案是转换成静态库,也就是.a格式的文件加上暴露出来的头文件。

iOS CocoaPods组件平滑二进制化解决方案及详细教程 0

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 0





2、为什么我们需要二进制化呢?

在我们App开发中,我们逐渐的抽象了很多模块、业务、UI等把他转换成私有CocoaPod库。其中有一个是用C++和Objective-C混写的,源码格式为.mm。在app项目编译时.mm部分代码编译非常慢。这作为一个契机让我们去考虑如何加快编译速度。

这个混写的CocoaPod库叫做YTXChart,之后会以此库为例反复提到。

另外随着业务的扩展,私有CocoaPod库和第三方CocoaPod库越来越多,App项目中的文件也越来越多。每次pod install安装新库或pod update更新库的时候,重新编译的过程需要等待很长时间。这也向我们提出了加快编译速度的需求。

另外如果想要做组件化的话,一定要做二进制化。

所以我们想到了二进制化的方案来解决这个问题,并且很多大公司也是这么做的。

这带来一个新问题?一步就位还是平滑过度。
对我们来说,这是一个尝试,不可能开始就决定把所有的私有CocoaPod库二进制化,也不可能决定把所有第三方CocoaPod库二进制化。当务之急的情况是加快YTXChart库编译速度。所以必须找到一个方案平滑过度。

我们的App中的podflie是这样的

[Bash shell] 纯文本查看 复制代码
target 'jryMobile' do  
    pod 'AFNetworking', '~> 2.6.3'
    pod 'Mantle', '~> 1.5.7'
    pod 'DateTools', '~> 1.7.0'
    pod 'ReactiveCocoa', '~> 2.3.1'
    pod 'CocoaAsyncSocket', '~> 7.4.1'
    pod 'FMDB', '~> 2.5'
    pod 'MWPhotoBrowser', '~> 1.4.1'
    pod 'MZFormSheetController', '~> 2.3.6'
    pod 'HMSegmentedControl', '~> 1.5.1'
    pod 'UMengAnalytics', '~> 3.5.8'
    pod 'UMengFeedback', '~> 2.3.4'
    pod 'TSMessagesNW', '~> 0.9.15'
    pod 'TPKeyboardAvoiding', '~> 1.2.9'
    pod 'SDWebImage', '~> 3.7'
    pod 'JHChainableAnimations', '~> 1.3.0' 
    pod 'BarrageRenderer', '~> 1.7.0'
    pod 'MJRefresh', '~> 3.1.7'
    pod 'YTXAnimations', '~> 1.2.4', :subspecs => ["AnimateCSS", "Transformer"]
    pod 'YTXMediaIJKPlayer', '~> 0.2.1'

    pod 'YTXTradeBusinessType', '~> 1.1.0'
    pod 'YTXServerId', '~> 0.1.4'
    pod 'YTXUtilCategory','~> 1.2.0'
    pod 'YTXScreenShotManager', '~> 0.1.7'
    pod 'YTXRequest', '~> 1.0.0'
    pod 'YTXCommonSocket', '~> 0.1.9'
    pod 'YTXChartSocket', '~> 0.5.1'
# 希望是二进制化的
    pod 'YTXChart', '~> 0.17.0'

    pod 'YTXRestfulModel', '~> 1.2.2', :subspecs => ["RACSupport", "YTXRequestRemoteSync", "FMDBSync", "UserDefaultStorageSync"]
    pod 'YTXWebViewJavaScriptBridge', '~> 0.1.2'
    pod 'YTXCheckForAppUpdates', '~> 1.0.0'
    #    pod 'YTXVideoAVPlayer', '~> 0.5.0'
    pod 'YTXChatUI', '~> 0.3.2'
    pod 'PNChart', '~>0.8.9'

    #pod 'EaseMobSDKFull', :git => 'https://github.com/easemob/sdk-ios-cocoapods-integration.git', :tag => '2.2.0'
    # EaseMobSDKFull 更新地址'https://github.com/easemob/sdk-ios-cocoapods-integration.git'
    #pod 'AFgzipRequestSerializer', '~> 0.0.2'

    pod 'AdhocSDK', '~> 2.2.1'

    pod 'FLEX', '~> 2.0', :configurations => ['Debug']

    pod 'React', :path => './ReactComponent/node_modules/react-native', :subspecs => [
    'Core',
    'RCTImage',
    'RCTNetwork',
    'RCTText',
    'RCTWebSocket',
    # 添加其他你想在工程中使用的依赖。
    ]

    pod 'CodePush', :path => './ReactComponent/node_modules/react-native-code-push'
end





3、平滑二进制方案需求点

  • 其他的CocoaPod库都还是源码。YTXChart为二进制化。
  • 以后能够逐步迭代把更多的以YTX开头的CocoaPod库进行二进制化,而不影响主App。
  • 能够提供一种方式把二进制化CocoaPod库切换回源码CocoaPod库以便调试。尽量做的方便。
  • 解决YTXChart引用依赖的问题。(YTXChart还依赖了第三方AFNetworking和私有YTXServerId。保证生成的静态库中不会含有AFNetworking的内容和YTXServerId的内容并且能够编译通过)
  • 利用原来的YTXChart.git,不创建新项目,不创建新的git库。因为我们的二进制化库的生成还是来自于源码,当源码更新时,我们需要一种非常快捷的方式去生成二进制的东西,不希望copy源码到某处,或者增加一个git submodule。
  • 希望App源码和YTXChart中的源码尽量少或者没有改动。
  • 希望App中的Podfile尽量少或者没有改动。
  • 希望Podfile中的版本号保持风格一致,不会出现'~> 2.2.1.binary'这种情况。
  • 用原来的那一个CocoaPods Repo Spec。


以下这个解决方案的教程满足了以上所有需求点

注意,以下的例子基于Cocoapods@1.0.1,而且目前只能是1.0.1




4、第一步:源码生成静态库

如果你是通过命令pod lipo create创建的CocoaPod库并且pod install的话,它的目录结构应该像这样子(只列出重要的):

[Swift] 纯文本查看 复制代码
YTXChart  
  |-Example
    |-YTXChart
    |-Pods
    |-YTXChart.xcodeproj
    |-YTXChart.xcworkspace
    |-Podfile
    \-Podfile.lock
  |-Pod
    |-Assets
    \-Classes
  \-YTXChart.podspec


在xcode中创建新Target YTXChartBinary File->New->Target->Framework & Library->Cocoa Touch Static Library

如果你们的项目最低支持到iOS8可以创建Dynamic Framework

注意在Podfile中加入以下这段


[Bash shell] 纯文本查看 复制代码
target 'YTXChartBinary' do

end


然后pod install

解释:Cocoapods@1.0.1会在Header Search Path自动加入内容。如果你用CocoaPods@0.39.0则需要自己加Header Search Path保证依赖库YTXServerId和AFNetwork能够被找到。如图:

iOS CocoaPods组件平滑二进制化解决方案及详细教程 1

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 1

headersearchpath

然后把Pod/Classes中的源码拖入到YTXChartBinary中,这样选择(这样会link源码而不是复制):

iOS CocoaPods组件平滑二进制化解决方案及详细教程 2

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 2


然后变成这样子:

iOS CocoaPods组件平滑二进制化解决方案及详细教程 3

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 3


Headers需要自己加,里面是你需要暴露的头文件

在YTXChartBinary Target中的Build Settings下找到iOS Deployment Target选择和YTXChart.podspec中的s.platform保持一致。这里是7.0 YTXChartBinary Target->Build Settings->iOS Deployment Target

在根目录创建shell脚本buildbinary.sh

你也可以创建一个Aggregate Target用来执行shell脚本

代码如下:

[Bash shell] 纯文本查看 复制代码
PROJECT_NAME="YTXChart"

BINARY_NAME="${PROJECT_NAME}Binary"

cd Example

INSTALL_DIR=$PWD/../Pod/Products  
rm -fr "${INSTALL_DIR}"  
mkdir $INSTALL_DIR  
WRK_DIR=build

BUILD_PATH=${WRK_DIR}

DEVICE_INCLUDE_DIR=${BUILD_PATH}/Release-iphoneos/usr/local/include  
DEVICE_DIR=${BUILD_PATH}/Release-iphoneos/lib${BINARY_NAME}.a  
SIMULATOR_DIR=${BUILD_PATH}/Release-iphonesimulator/lib${BINARY_NAME}.a  
RE_OS="Release-iphoneos"  
RE_SIMULATOR="Release-iphonesimulator"

xcodebuild -configuration "Release" -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${BINARY_NAME}" -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="${WRK_DIR}/${RE_OS}" LIBRARY_SEARCH_PATHS="./Pods/build/${RE_OS}"  
xcodebuild ARCHS=x86_64 ONLY_ACTIVE_ARCH=NO -configuration "Release" -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${BINARY_NAME}" -sdk iphonesimulator clean build CONFIGURATION_BUILD_DIR="${WRK_DIR}/${RE_SIMULATOR}" LIBRARY_SEARCH_PATHS="./Pods/build/${RE_SIMULATOR}"

if [ -d "${INSTALL_DIR}" ]  
then  
rm -rf "${INSTALL_DIR}"  
fi  
mkdir -p "${INSTALL_DIR}"

cp -rp "${DEVICE_INCLUDE_DIR}" "${INSTALL_DIR}/"

INSTALL_LIB_DIR=${INSTALL_DIR}/lib  
mkdir -p "${INSTALL_LIB_DIR}"

lipo -create "${DEVICE_DIR}" "${SIMULATOR_DIR}" -output "${INSTALL_LIB_DIR}/lib${BINARY_NAME}.a"  
rm -r "${WRK_DIR}"  


这个脚本写的并不是很好。说说主要做了什么。 Release不同的静态库,真机和模拟器的。只构建x86_64,不构建i386加快速度

[Bash shell] 纯文本查看 复制代码
xcodebuild -configuration "Release" -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${BINARY_NAME}" -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="${WRK_DIR}/${RE_OS}" LIBRARY_SEARCH_PATHS="./Pods/build/${RE_OS}"  
xcodebuild ARCHS=x86_64 ONLY_ACTIVE_ARCH=NO -configuration "Release" -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${BINARY_NAME}" -sdk iphonesimulator clean build CONFIGURATION_BUILD_DIR="${WRK_DIR}/${RE_SIMULATOR}" LIBRARY_SEARCH_PATHS="./Pods/build/${RE_SIMULATOR}"  


*通过lipo命令合并。新.a使用project name是因为要和App项目的OTHER_LDFLAGS兼容-l"YTXChart"

[Bash shell] 纯文本查看 复制代码
lipo -create "${DEVICE_DIR}" "${SIMULATOR_DIR}" -output "${INSTALL_LIB_DIR}/lib${PROJECT_NAME}.a" 


结果:

iOS CocoaPods组件平滑二进制化解决方案及详细教程 9

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 9




4.1、为什么要删除i386

实际上,二进制化方案就是以空间换时间。我们这个YTXChart库生成的.a去除i386之后大小有166.3M。上传到git仓库后,git会压缩。增加了33M左右。而作为二进制文件,git是没法做增量的。所以每次上传.a都会大大增加git库大小,增加硬盘使用量。考虑到我们的服务器硬盘只有60个G能用,以后还会二进制化很多组件。

所以得出:尽量压缩二进制文件大小;尽量不上传.a,直到发布某个版本时才上传。

当然,如果你的服务器硬盘是1T的话,我觉得你也可以随便搞。

现在文件目录是这样子的:

[Swift] 纯文本查看 复制代码
YTXChart  
  |-Example
    |-YTXChart
    |-Pods
    |-YTXChart.xcodeproj
    |-YTXChart.xcworkspace
    |-YTXChartBinary //空的
    |-Podfile
    \-Podfile.lock
  |-Pod
    |-Assets
    |-Classes //里面是源码
    \-Products
      |-include
         |-xxx.h
         |-...
         \-xxx.h
      \-lib
         \- libYTXChartBinary.a
  \-YTXChart.podspec





5、第二步:测试生成的静态库。

修改YTXChart.podspec如下:

[Bash shell] 纯文本查看 复制代码
Pod::Spec.new do |s|  
  s.name             = "YTXChart"
  s.version          = "0.17.7"
  s.summary          = "YTXChart for pod"

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!
  s.description      = "银天下Chart, 依赖AFNetworking"

  s.homepage         = "http://gitlab.baidao.com/ios/YTXChart.git"
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
  s.license          = 'MIT'
  s.author           = { "caojun-mac" => "78612846@qq.com" }
  s.source           = { :git => "http://gitlab.baidao.com/ios/YTXChart.git", :tag => s.version }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.platform     = :ios, '7.0'
  s.requires_arc = true


  s.source_files = 'Pod/Products/include/**'
  s.public_header_files = 'Pod/Products/include/*.h'
  s.ios.vendored_libraries = 'Pod/Products/lib/libYTXChart.a'


  s.libraries = 'sqlite3', 'c++'

  s.dependency 'YTXServerId'
  s.dependency 'AFNetworking', '~> 2.0'
end  


注意s.sourcefiles和s.publicheaderfiles和s.ios.vendoredlibraries的路径

Exampl/Podfile是长这样子的:

[Bash shell] 纯文本查看 复制代码
source 'http://gitlab.baidao.com/ios/ytx-pod-specs.git'  
source 'https://github.com/CocoaPods/Specs.git'

target 'YTXChart_Example' do  
  pod "YTXChart", :path => "../"
  pod 'ReactiveCocoa', '~> 2.5'
  pod 'YTXChartSocket'
  pod 'AFNetworking', '~> 2.0'
end

target 'YTXChartBinary' do

end

target 'YTXChart_Tests' do  
  pod "YTXChart", :path => "../"
  pod 'Kiwi'
end  


执行pod install后应该是这样子的,然后跑起来没问题

iOS CocoaPods组件平滑二进制化解决方案及详细教程 4

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 4

staticbuildresult

执行pod lib lint --sources='http://gitlab.baidao.com/ios/ytx-pod-specs.git,master'--verbose --use-libraries --fail-fast也是好的


至此我们构建出一个静态库,只包含YTXChart的内容,不包含依赖AFNetwork和YTXServerId的内容

证明:把s.dependency 'AFNetworking', '~> 2.0'去除再执行pod lib lint 'http://gitlab.baidao.com/ios/ytx-pod-specs.git,master' --verbose --use-libraries --fail-fast会报出找不到AFNetwork相关文件。

题外话:因为CocoaPods1.0.1不支持C++项目的lint(这是一个defect),所以这个时候我会切回CocoaPods@0.39.0来lint和publish。而前面pod instal增加Search Path是依靠CocoaPods@1.0.1。如果你不是.mm混写的,是不会有这个问题的。尽管使用CocoaPods@1.0.1。强行当作没看到这个题外话。

下一步解决如何在源码和二进制中切换 修改YTXChart.podspec为以下内容:

[Bash shell] 纯文本查看 复制代码
#
# Be sure to run `pod lib lint YTXChart.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see [url=http://guides.cocoapods.org/syntax/podspec.html]http://guides.cocoapods.org/syntax/podspec.html[/url]
#

Pod::Spec.new do |s|  
  s.name             = "YTXChart"
  s.version          = "0.17.7"
  s.summary          = "YTXChart for pod"

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!
  s.description      = "银天下Chart, 依赖AFNetworking"

  s.homepage         = "http://gitlab.baidao.com/ios/YTXChart.git"
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
  s.license          = 'MIT'
  s.author           = { "caojun-mac" => "78612846@qq.com" }
  s.source           = { :git => "http://gitlab.baidao.com/ios/YTXChart.git", :tag => s.version }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.platform     = :ios, '7.0'
  s.requires_arc = true


 if ENV['IS_SOURCE']
    puts '-------------------------------------------------------------------'
    puts 'Notice:YTXChart is source now'
    puts '-------------------------------------------------------------------'
      s.source_files  = "Pod/Classes/painter/*.{h,m,mm}", "Pod/Classes/painterview/*.{h,m,mm}", "Pod/Classes/chart/*.{h,m,mm}", "Pod/Classes/core/*.{h,mm}", "Pod/Classes/core/**/*.{h,m,mm,inl}"  
  else
    puts '-------------------------------------------------------------------'
    puts 'Notice:YTXChart is binary now'
    puts '-------------------------------------------------------------------'
    s.source_files = 'Pod/Products/include/**'
    s.public_header_files = 'Pod/Products/include/*.h'
    s.ios.vendored_libraries = 'Pod/Products/lib/libYTXChart.a'
  end

  s.libraries = 'sqlite3', 'c++'

  s.dependency 'YTXServerId'
  s.dependency 'AFNetworking', '~> 2.0'
end


注意这段if ENV['IS_SOURCE']。我们的需求是优先使用二进制,偶尔才会切回源码。

删除Example/Pods目录。

执行IS_SOURCE=1 pod install。你会看到Example/Pods/YTXChart/里面都是源码

输出Notice:YTXChart Now is source

进一步跑起模拟器,因为是源码编译用了很长时间,模拟器起来,一切也是好的

再试下pod cache clean --all && IS_SOURCE=1 pod lib lint也是好的

再试下pod cache clean --all && pod lib lint也是好的

现在我们通过if else简单地实现了本地Example App项目切换源码和二进制。



发布到自己的pod repo spec

发布就和正常发布没有任何区别。



检查从spec repo的source中安装

Podfile修改为pod 'YTXChart', '~> 0.17.7'

以下两步很重要

[Bash shell] 纯文本查看 复制代码
pod cache clean --all


删除Example/Pods

然后pod install

检查Example/Pods/YTXServerId/和Example/Pods/AFNetwork/发现都是.h .m源码。

检查Example/Pods/YTXChart/里的是二进制.a和头文件。跑起App并没有问题。




6、尝试切回源码

如果你直接IS_SOURCE=1 pod install你会发现Example/Pods/YTXChart/里的内容都变成了空

这是为什么呢,因为pod cache了一个podspec.json。可以通过pod cache list查看。他cache了一个描述如何从s.source中找到相关文件。现在的描述还是从Pod/Products/下去找,自然为空。

为了避免这个问题,所以必须执行上面两步。这个是唯一的问题,目前我还找不到更好的解决方案。切换的行为只是偶尔发生,这是可以接受的。

执行2步。再次IS_SOURCE=1 pod install你就发现Example/Pods/YTXChart/里的内容都变成了.h .mm源码。跑起App也是好的。

为什么lint之前要cache clean。原理是一样的。如果YTXChart依赖的YTXServerId也被做成了二进制化就需要cache clean。不过你也可以这样pod cache clean YTXServerId

特别注意IS_SOURCE应当作为一个所有非二进制化Pod库的统一标识,并且通知你们的项目组里所有成员。pod install可能会有某几个已经二进制化的库使用二进制的内容。IS_SOURCE=1 pod install时,所有的库都将会是源码的内容。

7、版本管理

请参考这篇我的文章CocoaPod版本规范




8、完整分析

当你发布完成之后,查看。我们发现在Spec Repo中对应版本的podspec就是我们的YTXChart/podspec。 CocoaPod从s.source git地址和tag下载对应的代码,Pod/Products和Pod/Classes里的内容都存在 当你使用IS_SOURCE=1ENV['IS_SOURCE']会为true。CocoaPods通过s.source_files从下载代码的路径找到源码构建Example/Pods和YTXChart.xcworkspace

iOS CocoaPods组件平滑二进制化解决方案及详细教程 5

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 5


明白了上面的过程,来再分析下为什么要在切换源码和二进制化时删除cache和Pods目录。放几张图就明白了

iOS CocoaPods组件平滑二进制化解决方案及详细教程 6

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 6


iOS CocoaPods组件平滑二进制化解决方案及详细教程 7

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 7


删除cache和Pods目录。IS_SOURCE=1 pod install观察json。

iOS CocoaPods组件平滑二进制化解决方案及详细教程 8

iOS CocoaPods组件平滑二进制化解决方案及详细教程1 - 敏捷大拇指 - iOS CocoaPods组件平滑二进制化解决方案及详细教程 8





9、再进一步

当你删除了所有cache之后再pod install会比较慢,有时候我们只是想要查看某个库的源码,怎么办。

  • podspec中变成这样子if ENV['IS_SOURCE'] || ENV["YTXChart_SOURCE"]
  • 删除Pods/Pods.xcodeproj
  • 删除Pods/YTXChart
  • 删除YTXChart的cache pod cache clean YTXChart
  • 最后YTXChart_SOURCE=1 pod install





10、总结:

  • 没有使用submodule或新的git仓库来构建出一个不包含依赖内容的静态库。一份原来的git仓库。
  • 没有因为构建二进制库而需要增加冗余的源代码。所以当你修改Pod/Classes中的源码,可以方便简单地执行buildbinary.sh脚本来构建出静态库。一份源码。
  • 共用了一份YTXChart.podspec
  • 没有大量修改YTXChart.podspec
  • 使用pod lib lintIS_SOURCE=1 pod lib lint检查通过。
  • 没有修改Podfile。这个Example的Podflie只是测试需要才改的。主App项目中的Podfile可以一行都不改。不会出现'~> 2.2.1.binary'
  • App中的源码不会因为使用了二进制CocoaPods组件而做任何修改。
  • 没有手动配置Search Path,这样更容易。
  • 在Example App中可以通过IS_SOURCE灵活地切换源码和二进制静态库。唯一一个问题每次切换要删除Pods目录和pod cache clean --all
  • 跑起Example App总是好的。
  • 没有影响到其他库,我可以逐步平滑地把YTXXXX一个一个做成二进制。





11、下一步目标

逐步平滑地把YTXXXX一个一个做成二进制

进一步的把第三方如AFNetwork在私有spec repo中做份镜像也提供二进制化

把Podfile中绝大部分组件都做成二进制(RN这种本地安装模式和有sub spec的库目前不打算二进制化)


关于资源文件,资源文件在二进制化中的配置是一样的

另外,使用二进制化的CocoaPods库不会增加ipa的大小。所以我们应当优先用二进制化的东西,这可以加快Archive速度。




12、关于有sub spec的CocoaPods组件

两个方案:

  • 提供一个全集
  • 对每一个sub spec都做份二进制并保持它们之间依赖的相互关系





13、走过的弯路!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

现在这个解决方案看起来简单,但在当初的探索过程中并不是那么顺利。以下是不成功的尝试!



13.1、创建另一个YTXChartBinary.podspec

  • 把生成的Products目录放到YTXChartBinary下
  • 把YTXChartBinary.podspec目录放到YTXChartBinary下
  • Podfile中通过增加Binary字段安装二进制化如pod 'YTXChartBinary', '~> 0.17.7'


问题

  • 要维护2个podspec。版本号很可能不统一。
  • pod spec lint报错:找不到相关文件。
  • Podfile中通过增加Binary字段来切换,非常不方便。
  • 要改App源码。当安装二进制的时候<YTXChart/YTXChart.h>需要改成<YTXChartBinary/YTXChart.h>。来回切换都需要改,极不方便。
  • 要改App源码。这次一劳永逸。直接这样使用"YTXChart.h"。但这样也不好。




13.2、创建另一个专门放二进制化的Spec Repo,通过不同的Source来区分

解决了要改App源码的问题。只需要在Podfile中加个source。

不同的source例子 source 'http://gitlab.baidao.com/ios/ytx-binary-pod-specs.git'
source 'http://gitlab.baidao.com/ios/ytx-pod-specs.git'

问题

  • 发布两次,lint两次。
  • 创建了2个Spec Repo。





14、后记

有人问我为什么不改用Carthage

CocoaPods和Carthage设计目的不一样。

我们的现在组织架构有多个iOS team,多个App。

  • 已经使用了CocoaPods,如果要再集成Carthage比较麻烦。我们自己team还好说,还有其他team怎么办。
  • 其他team已经用的是CocoaPods。对他们来说只需要升级版本号,要用源码时加上一个IS_SOURCE=1 pod install就可以了。够平滑。
  • Carthage我要如何方便的切回源码调试。
  • 源码如何管理,如何在不同team之间共用?submodule的方式其实还不如cocoapods。
  • Carthage对于库版本管理我要怎么做?并且通知到其他team。而且他们得先更新submodule,谁去通知他们需要更新submodule。此次的更新是必须的吗?我用旧的framework不可以吗?还是版本管理的问题。
  • 如果内容更新,你在本地还是需要build一次。当然我可以把这些framework上传到git,我team的其他人可以不用build,只需要get fetch就可以。其他team的git源和我们不一样的话,他们也得build一遍。
  • 对于有些内容我们将来可能会开源,显然用CocoaPods更好。因为CocoaPods是事实上的标准了。对这点最重要。
  • 也许只用Carthage来自动生成二进制的内容是个不错的选择,尤其是动态framework。但只是整个方案其中一小步而已。


说到底Carthage并不能解决实际应用的问提。




欢迎订阅全球最大的Swift开发者社区敏捷大拇指Swifthumb.com)上的淘帖“iOS App 组件化架构”。




相关内容

滴滴/淘宝/微信/蘑菇街/casatwy等 iOS App的组件化架构漫谈

滴滴 iOS App的组件化实践与优化

纳斯达克上市公司 iOS App组件化开发实践

纳斯达克上市公司 CocoaPods组件平滑二进制化解决方案

iOS CocoaPods组件平滑二进制化解决方案及详细教程1

iOS CocoaPods组件平滑二进制化解决方案及详细教程2之subspecs篇




作者:曹俊

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

cocoaswift 发表于 2016-7-28 00:22:36 | 显示全部楼层
不错!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表