基于cocoapods的App模块化

作者: uniapp | 来源:发表于2017-05-07 10:47 被阅读393次

    随着产品的迭代升级,增加的模块越来越多,项目也会越来越复杂.随之也就带来的一个非常头疼的问题:代码量庞大(动辄上百M),更让人难以忍受的是蜗牛般的编译速度.为了解决这个问题,我们试着对项目进行基于功能的模块拆分,也就是近来一直提出的模块化.
    前期我们参考了豆瓣的开源模块化和github上一个star数字较多的框架,它们都是对一个项目中代码的分离,利用NSClassFromString方法,通过对路径处理或者直接传递字符串,创建所需要的类型.这样能对不同模块的代码进行解耦,但是仍然无法将项目拆解成不同功能的小项目.经过不断的讨论,我们最终选择了基于cocoapod的模块化.
    将不同的模块独立成一个项目,让后再主工程中通过cocoapod对不同的项目进行管理和集成,使负责人员专注于自己的模块进行开发,而主工程通过不同的tag对模块进行引用,避免了在所有人都要在主工程运行全部代码的头疼问题.
    基于cocoapod,所以需要对cocoapod有较全面的理解,请参考我上篇写的:
    从零创建cocoapods私有仓库

    下面以一个简单的Demo,详细介绍实现思路.
    项目中"我的"模块,一般都会带有登录验证,儿其他模块也有可能会用到登录部分,所以我们可以把登录独立出一个模块.
    首先在gitlub新建一个repository,命名为LoginModule,如下图:

    Snip20170505_9.png

    具体选择请参考上图.
    然后通过SourceTree将工程下载到本地,添加Xcode新建的LoginModule工程,最后的文件层级图应该是下图这样的:

    文件层级.png

    为了更方便的创建.podsepc文件,如果不是上述文件层级,请手动调整.其中.podspec文件,是cocoapods引用时的识别文件,由于需要与文件层级很严格的配置,建议直接拷贝,下面是我经过测试正确的配置:

    Pod::Spec.new do |s| #s代表文件夹位置为一级,ss代表文件夹位置为二级
    
      s.name         = "LoginModule"
      s.version      = "0.0.16"
      s.summary      = "LoginModule for iOS project."
      s.description  = <<-DESC
                      LoginModule
                      DESC
      s.homepage     = "https://github.com/zhudong10/LoginModule"
      s.license      = { :type => "MIT", :file => "LICENSE" }
      #导入工程的pch文件
      s.prefix_header_file = 'LoginModule/ZDPrefixHeader.pch'
      s.author             = { "zhudong" => "zhudongdong@91guoxin.com" }
      s.source       = { :git => "https://github.com/zhudong10/LoginModule", :tag => "#{s.version}" }
      s.source_files  = "LoginModule/LoginModule.h" #此处需要在本级目录下找到文件
                  # 目的文件夹名称 #
      s.subspec 'LoginModule' do |ss| 
                          # 文件来源 #
        ss.source_files = 'LoginModule/LoginUI/**/*.{h,m}'
                          # 资源文件 #
        ss.resources = ['LoginModule/Login.xcassets', 'LoginModule/LoginUI/**/*.xib']
        #ss.resources = 'LoginModule/LoginUI/**/*.xib'
        #ss.resources = 'LoginModule/**/*.xcassets'
      end
    s.subspec 'Category' do |ss| 
                  # 文件来源 #
        ss.source_files = 'LoginModule/Category/**/*.{h,m}'
        end
    
    end
    

    .podspec文件识别的是实体文件夹,为了便于对文件管理,在LoginModule中建立了如下的文件夹和文件,和上述的配置相匹配.

    文件夹和文件.png

    由于cocoapod引用时,如果没有tag的区分,只会引用第一次提交的代码,所以需要对提交的代码分支,添加tag,方法如下图:

    添加tag.png

    而且需要推动到远程分支:

    推动到远程分支.png

    经历上面的步骤,就完成了LoginModule工程的创建.下面让我们在主工程中对其用cocoapod进行引用.

    新建工程MineModule,对其进行pod init,创建podfile文件,对podfile文件进行如下配置:

    # Uncomment the next line to define a global platform for your project
    # platform :ios, '9.0'
    
    target 'MineModule' do
      # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
      # use_frameworks!
        pod 'LoginModule', :git => 'https://github.com/zhudong10/LoginModule', :tag =>'0.0.16', :inhibit_warnings => false
      
    end
    

    其中的tag就是对LoginModule项目引用的区分.
    执行pod install命令后,就能顺利引如LoginModule模块,如果出现错误:

    zhudongdeMacBook-Pro:MineModule zhudong$ pod install
    Analyzing dependencies
    Pre-downloading: `LoginModule` from `https://github.com/zhudong10/LoginModule`, tag `0.0.3`
    [!] Unable to find a specification for 'LoginModule'.
    
    [!] Unable to load a podspec from `LoginModule.podspec`, skipping:
    
    Pod::DSLError
    

    是LoginModule工程中.podspec文件配置错误,请详细检查;
    如果pod install成功引用LoginModuel,但是编译时出现:

    /Users/zhudong/Documents/Demo/Later2017.5.5/MineModule/MineModule/Pods/LoginModule/LoginModule/LoginUI/LoginSuccessController.m:17:1: Cannot synthesize weak property because the current deployment target does not support weak references
    

    则是因为xib文件没有正确引用,需要在MineModule的podfile中添加修改代码,最终的语句如下:

    # Uncomment the next line to define a global platform for your project
    # platform :ios, '9.0'
    
    target 'MineModule' do
      # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
      # use_frameworks!
        pod 'LoginModule', :git => 'https://github.com/zhudong10/LoginModule', :tag =>'0.0.16', :inhibit_warnings => false
      
      post_install do |installer|
          installer.pods_project.targets.each do |target|
              target.build_configurations.each do |config|
                  config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'
              end
          end
      end
    
    end
    

    如果大功告成,文件层级结果应该如下图:

    结果.png

    最终运行MineModule,我们看到:

    MineModule03.gif

    如果开发过程中,登录内容有所变化,那就只要在LoginModule中进行更改,然后在主工程中更新pod就行了,感觉是不是超棒?

    点击收藏和喜欢都是对我的支持和鼓励

    相关文章

      网友评论

        本文标题:基于cocoapods的App模块化

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