组件化

作者: 花椒不麻牙 | 来源:发表于2017-09-11 10:42 被阅读0次

    年前调研了关于组件化的一些实施方案,最终确定将项目进行分层和业务拆分成独立工程,为了便于管理,业务组件和业务库采用CocoaPods做依赖管理。因为是私有的代码,所以一定不希望别人都可以搜索到,那第一步就是建立自己的私有仓库,即私有spec repo。

    Spec Repo

    所谓Spec Repo,就是Pods的索引。一旦在podfile中设置source为某个私有repo的git地址,在进行pod update的时候就会去这个repo中进行检索,如果检索到对应的pod,会读取该Pod的podspec从而进行安装。建立私有repo很简单,首先在gitlab创建一个仓库

    复制git地址,然后在本地终端执行以下命令,

    pod repo add EthercapPrivateSpechttp://git.ethercap.com/mobile-componentization/EthercapPrivateSpec.git

    add后面代表私有库索引的名称,可以和git仓库的名称不同,这里为了方便,我取了一样的名字。执行成功之后,可以在cocoapods目录下看到自己的spec文件夹

    这里提以下,repos里面的master文件夹,就是cocoapods的主索引,平时我们使用的SDWebImage,AFNetworking都是从这里进行的搜索和匹配

    创建私有仓库

    建立好私有索引后,就可以继续下一步,创建自己的私有仓库,这里我以网络基础库为例子,首先在目标文件夹下,执行以下命令

    创建cocoapods工程

    pod lib create EthercapNetworkLibrary

    之后,cocoapods会自动下载工程模板,完成后,会问几个关于配置的问题,语言种类、是否需要测试demo、测试框架等


    这里我选择OC作为开发语言,包含测试demo,这样就不用新建一个测试工程,节省一些步骤,全部填写后,会自动打开cocoapods帮你建立好的模板工程,目录结构如下

    需要注意的是,和平时开发有所不同,现在我们的开发都应该在Pod工程下进行,在Classes文件夹下添加需要的类,开发完成后,在demo工程中写测试代码,就可以直接运行和测试了,非常方便,这里就不在赘述。

    编写Spec文件

    想要建立私有库,还有一个文件非常重要,就是podspec,工程的索引文件,打开文件,删除掉无用注释,键入以下内容

    编写Spec文件

    Pod::Spec.newdo|s|

    s.name         ="EthercapNetworkLibrary"

    s.version      ="0.0.2"

    s.summary      ="EthercapNetworkLibrary."

    s.description  = <<-DESC

    this is EthercapNetworkLibrary

    DESC

    s.homepage     ="http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary"

    s.license      = {:type=>"MIT",:file=>"FILE_LICENSE"}

    s.author             = {"Muqiushi"=>"Muqiushi@ethercap.com"}

    s.platform     =:ios,"8.0"

    s.source       = {:git=>"http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary.git",:tag=> s.version.to_s }

    s.subspec'AFNetworking'do|network|

    network.source_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/AFNetworking/*.{h,m}"

    network.public_header_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/AFNetworking/*.h"

    network.frameworks ="SystemConfiguration","CoreTelephony"

    network.library ="resolv"

    network.ios.vendored_frameworks ="EthercapNetworkLibrary/Frameworks/AlicloudHttpDNS.framework","EthercapNetworkLibrary/Frameworks/AlicloudUtils.framework","EthercapNetworkLibrary/Frameworks/UTDID.framework"

    end

    s.subspec'UIKit+AFNetworking'do|networkui|

    networkui.source_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/UIKit+AFNetworking/*.{h,m}"

    networkui.public_header_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/UIKit+AFNetworking/*.h"

    networkui.dependency"EthercapNetworkLibrary/AFNetworking"

    end

    end

    解释以下里面的几个主要内容

    name:pod search时提供给别人的检索名字

    version:工程版本号,一般是和tag相对应

    source::git 工程的git地址,:tag工程的标签版本

    source_file: 上传到远端的本地文件路径,在这些路径下的文件才会被打包

    frameworks: 工程用到的系统framework名字

    library:工程用到的系统library,注意,这里需要去掉前面的lib前缀

    vendored_frameworks:工程中使用的第三方framework,需要加入路径

    更多属性可以参照官网教程来写,Podspec Syntax Reference

    上传到私有Spec Repo

    开发完成并编辑好spec文件后,就可以进行上传,以便让别人可以通过pod方式引入我们的工程。在上传之前,首先要检验本地spec文件的有效性,是否存在错误和引用依赖是否完备,在工程根目录下执行以下命令

    本地检查Spec文件合法性

    pod lib lint

    有错误的话按照提示修改spec文件,成功的话会提示:

    EthercapNetworkLibrary passed validation.

    接下来远程检查pods,这次cocoapods会根据podspec文件里的source 检查对应的仓库里有没有指定tag的仓库。显然我们还没有将tag上传到github的仓库里,可定会报错,执行试一下

    远程检查Spec合法性

    pod spec lint

    -> EthercapNetworkLibrary (0.0.2)

    - WARN  | description: The description is shorter than the summary.

    - ERROR | [iOS] unknown: Encountered an unknown error ([!] /Applications/Xcode.app/Contents/Developer/usr/bin/git clone http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary.git /var/folders/6x/8pyfnj_n4573cq4206yjz41c0000gn/T/d20161017-14130-148x77b --template= --single-branch --depth 1 --branch 1.0

    Cloning into'/var/folders/6x/8pyfnj_n4573cq4206yjz41c0000gn/T/d20161017-14130-148x77b'...

    fatal: Remote branch0.0.2not found in upstream origin

    ) during validation.

    Analyzed1podspec.

    [!] The spec did not pass validation, due to1error and1warning.

    提示0.0.2没有找到,所以先把工程上传,打tag,注意tag名一定要是0.0.2,和spec中相同,具体git操作自行解决。

    之后再次执行

    pod spec lint

    提示EthercapNetworkLibrary passed validation.说明检测通过

    最后执行一下命令,将spec文件上传到spec repo中

    pod repo push EthercapPrivateSpec EthercapNetworkLibrary.podspec

    上传成功后,可以在仓库中看到你的spec文件

    至此,我们的工程就可以和AFNetworking一样,通过pod被别人引用,尝试执行一下pod search EthercapNetworkLibrary

    over

    相关文章

      网友评论

          本文标题:组件化

          本文链接:https://www.haomeiwen.com/subject/ybttsxtx.html