自定义私有库目录结构

2018-10-08  本文已影响29人  小千

需求原因

主项目随着业务的增多,体积和代码量越来越大,代码耦合性高,也不利于bug的定位,新同事也需要花很长时间消化。故将项目组件化提上日程——主项目由主项目代码+公共组件库+业务需求组件等构成,目录如下:

//主项目
—— XQMainProject  
/*主项目无法组件化的代码*/
└── XQMainProjectCode 

/*公共组件*/
//通用的UI控件库
└── XQ_UIKit
//公共的Category,工具类,宏定义等
└── XQ_UIFoundation
...

/*业务组件*/
//新闻模块
└── XQ_News
//商城模块
└── XQ_Store
//视频模块
└── XQ_Video
...

本文不是在于记录如何搭建、使用、发布私有库,对此有兴趣可以看这里。本文是对比传统构建私有库方法创建的项目目录,自定义新的,更加方便的项目架构目录。


分析 pod lib create 创建的私有库

在终端中执行:

pod lib create  <LibName>

pod lib create XQComponentTmp

然后按提示进行配置,最后会生成如下图所示的目录结构:


传统方式创建的XQComponentTmp项目目录

右上图可知,创建后的项目目录整理如下:

—— XQComponentTmp  
/*Pods项目的副本*/
└── _Pods.xcodeproj
/*私有库的演示demo项目*/
└── Example 
         /*demo项目代码*/
        └── XQComponentTmp
        /*demo项目*/
        └── XQComponentTmp.xcodeproj 
        /*xcworkspace,管理demo项目和Pods项目*/
        └── XQComponentTmp.xcworkspace 
        /*Podfile文件*/
        └── Podfile
        /*Pods相关的文件*/
        └── Pods
         ...
/*私有库*/
└── XQComponentTmp
         /*私有库资源文件*/
        └── Assets
         /*私有库所有代码文件*/
        └── Classes
/*私有库的podspec文件*/
└── XQComponentTmp.podspec
/*Git管理相关文件*/
└──.git
...

所以,这种方式创建的工程目录这么几点不太便捷:
1、git和私有库代码在一级目录,pods在二级目录,若私有库发生更改,则提交代码到远程仓库需切换到一级目录,演示demo项目更新私有库需回到二级目录。更改频繁,需频繁切换,容易造成错误。
2、观察workspace目录结构,Pods引入了私有库XQComponentTmp,且代码嵌套在三级目录,不方便查看管理。


workspace目录结构

由上图也可感受到,整个项目目录并不怎么清爽,故构思自定义私有库的目录结构,使得git管理和pod管理在一个目录结构下,且整个代码架构清新。


自定义私有库的搭建目录

1、自定义的私有库目录结构:

—— XQComponentTmp  
/*私有库的podspec文件*/
└── XQComponentTmp.podspec
/*私有库项目*/
└── XQComponentTmp.xcodeproj
/*私有库的所有代码资源文件*/
└── XQComponentTmp
        /*私有库资源文件*/
        └── Assets
        /*私有库所有代码文件*/
        └── Classes
/*演示demo*/
└── XQComponentTmpDemo 
        /*demo项目*/
        └── XQComponentTmpDemo.xcodeproj
        /*demo项目的所有代码资源文件*/
        └── XQComponentTmpDemo 
/*workspace文件*/
└──XQComponentTmp.xcworkspace
/*Podfile文件*/
└── Podfile
/*Pods相关的文件*/
└── Pods
/*Git管理相关文件*/
└──.git
...

2、实践

2.1、创建私有库
pod spec create <LibName> //此处LibName为XQComponentTmp

编辑配置:

#
# Be sure to run `pod lib lint XQComponentTmp.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 https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
    s.name             = 'XQComponentTmp'
    s.version          = '0.1.0'
    s.summary          = 'XQ自定义组件模版'

    # 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      = <<-DESC
    XQ自定义组件模版,用于公共、业务组件的构造。
    DESC

    s.homepage         = 'https://github.com/xq0216/XQComponentTmp'
    s.license          = { :type => 'MIT', :file => 'LICENSE' }
    s.author           = { 'xq' => 'xxx@gmail.com' }
    s.source           = { :git => 'git@github.com:xq0216/XQComponentTmp.git', :tag => s.version.to_s }

    s.ios.deployment_target = '8.0'

    s.source_files = 'XQComponentTmp/Classes/**/*'

    s.resource_bundle = {
        'XQComponentTmp_Bundle' => ['XQComponentTmp/Assets/*.xcassets']
    }

    s.public_header_files = 'XQComponentTmp/Classes/**/*.h'

    #依赖的系统库
    s.frameworks = 'UIKit', 'Foundation', 'CoreGraphics'

    #依赖的第三方库
    #s.dependency 'BeeHive', '1.6.0'
    #s.dependency 'JLRoutes', '2.1'
    #s.dependency 'JSONModel', '~> 1.7.0'
    #s.dependency 'Masonry', '~> 1.1.0'
end

那么此时私有库项目就初步创建完成,可以在Classes目录下简单创建私有库文件:


私有库项目目录
2.2、创建Demo演示项目

demo项目用于演示如何使用私有库,方便主项目快速集成使用。

/*创建*/
touch Podfile
/*编辑*/
vim Podfile

编辑后如下:

#use_frameworks!

platform :ios, '8.0'
#指定源
source 'https://github.com/CocoaPods/Specs.git'

# 辨识是哪个workspace,没有则创建名为XQComponentTmp的workspace
workspace 'XQComponentTmp'

# 辨识是哪个target
target 'XQComponentTmpDemo' do
    # 辨识是哪个项目
    project 'XQComponentTmpDemo/XQComponentTmpDemo.xcodeproj'
    # 引入私有库(同级路径)
    pod 'XQComponentTmp', :path => './'

end

################## Pods Script ###################
#配置Pods工程预编译宏
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if config.name.include?('Debug')
                config.build_settings['GCC_OPTIMIZATION_LEVEL'] = 0
            end
        end
    end
end

pod install

此时demo项目已经完成了私有库的引入,完整文件目录如下所示:


项目目录
2.3、测试私有库
- (id)init{
    self = [super init];
    if (self) {
        self.backgroundColor = [UIColor redColor];
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];

    //test component
    XQTestView *testView = [[XQTestView alloc]init];
    testView.frame = CGRectMake(0, 0, 100, 100);
    testView.center  = self.view.center;
    [self.view addSubview:testView];
}

3、补充

3.1、私有库依赖其他库

1)若私有库本身有依赖其他库(第三方库、私有库等),如G7_ResourceManage.podspec文件中:

 #依赖的第三方库
s.dependency 'JSONModel', '~> 1.7.0'

2)这个私有库也需要pod管理依赖的第三方库,所以podfile中添加如下:

target 'XQComponentTmp' do
    # 辨识是哪个项目
    project 'XQComponentTmp.xcodeproj'
    pod 'JSONModel', '~> 1.7.0'
end

3)执行pod install,这样私有库即能成功和第三方库进行管理。

4)测试:
在XQComponentTmp/Class目录下,添加继承于JSONModel的子类XQTestModel,然后编译XQComponentTmp


若编译成功,说明XQTestModel.h中成功#import "JSONModel.h",即成功关联上第三方库。私有库引用第三方库成功!
3.2、添加代码格式化

clang-format 是真正实现代码规范的执行文件(网上找的,可以配置代码规范规则,之后抽空研究下),利用shell脚本,在编译时,动态执行clang-format,来实现进行代码格式化。shell脚本formatCodeStyle.sh如下所示 :

#!/bin/sh
clang_format=$SRCROOT/bin/clang-format
run_clangformat() {
    local filename="${1}"
    cd $SRCROOT
    if [ ! -f "$filename" ]; then
    return
    fi
    FILE_ALIAS='file'

    if [[ "${filename##*.}" == "m" || "${filename##*.}" == "h" || "${filename##*.}" == "mm" || "${filename##*.}" == "hpp" || "${filename##*.}" == "cpp" || "${filename##*.}" == "cc" ]]; then
    echo "$SRCROOT/$filename"
    echo "存在"
    $clang_format -i -style=$FILE_ALIAS "$SRCROOT/$filename"
    fi
}

git diff --name-only | grep "XQComponentTmp/" | while read filename; do run_clangformat "${filename}"; done

shell脚本配置:选中需要添加代码规范的文件所属的TargetBuild PhasesNew Run Script Phase

echo "开始格式化"
"${SRCROOT}/scripts/formatCodeStyle.sh"

这样,每次编译,该工程的所有文件代码,就自动进行了格式化。(可以用if-else进行测试)


项目在这里

上一篇下一篇

猜你喜欢

热点阅读