iOS组件化ios开发IOS 工具使用

iOS组件化之私有库

2018-08-30  本文已影响436人  TitanCoder

本地库方案

创建本地私有库

//进入TitanFMBase文件夹
cd xxx/AllMoudles/TitanFMBase

//初始化git
git init

//将本地代码提交到本地仓库
git add .

// 提交修改到本地仓库
git commit -m '你的修改记录'

//创建spec文件
pod spec cteate TitanFMBase

最后打开TitanFMBase文件夹中的TitanFMBase.podspec, 修改对应的配置信息, 可参考修改博客

<div class="note warning"><p>注意点</p></div>

source配置中, 本地库的git地址不需要填

s.source = { :git => "", :tag => "#{s.version}" }

使用本地私有库

pod 'TitanFMBase', :path => '../AllMoudles/TitanFMBase'

<div class="note warning"><p>注意点</p></div>

远程私有库

CreateSpec

创建远程私有库

createLib

做完上述工作即可将项目所有文件提交到远程私有库了

// 将本地代码加入本地仓库里
git add .

// 提交修改到本地仓库
git commit -m '你的修改记录'

// 查看当前的远程连接
git remote
// 添加名称为origin的远程连接
git remote add origin '你的github项目地址'

// 在push之前, 查看spec是否配置有问题
// 验证本地spec文件是否有误
pod lib lint
// 验证远程spec文件是否有误
pod spec lint

// 推送master分支的代码到名称为origin的远程仓库
git push origin master
// 查看当前的tag值
git tag

// 设置tag值
git tag "0.0.1"  

// 上传提交tag
git push --tags


// 删除标签相关命令
// 先删除本地再删除远程标签, 删除后需要重新打标签
// 删除本地标签
git tag -d 0.0.1

// 删除远程标签
git push origin :0.0.1

提交私有的SpecRepo

向私有的SpecRepo中提交podspec:

pod repo push SpecName XXX.podspec

<div class="note warning"><p>注意点</p></div>

使用私有库

master
- Type: git (master)
- URL:  'https://github.com/CocoaPods/Specs.git'
- Path: /Users/xxx/.cocoapods/repos/master

TitanFMSpec
- Type: git (master)
- URL:  'https://git.coding.net/CoderTitan/TitanFMSpec.git'
- Path: /Users/xxx/.cocoapods/repos/TitanFMSpec

Podfile文件中配置信息

// 远程私有库
source 'https://git.coding.net/CoderTitan/TitanFMSpec.git'
// 官方仓库
source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'

target 'TitanjunFM' do
  use_frameworks!

pod 'TitanFMBase'
pod 'MJExtension'

end

更新私有库

更新远程私有库

  1. 修改xxx/xxx/Classes文件夹下对应的库文件
  2. 更新测试工程的Pod库文件: pod update --no-repo-update
  3. 更新xxx.podspec文件的配置信息, 版本号一定要改
  4. 提交代码到远程仓库: git push origin master
  5. 更新tag标签: git push --tags
  6. 更新远程和本地的私有索引库: pod repo push SpecName XXX.podspec

私有库依赖

初步设计方案

s.dependency 'AFNetworking'
s.dependency 'SDWebImage'

优化方案

上述方案存在的问题: 假如另外一个业务线, 仅仅需要依赖一些基础配置, 但是, 如果把整个库作为依赖, 便会导入一些不用的冗余代码

-> AFNetworking (3.2.1)
   A delightful iOS and OS X networking framework.
   pod 'AFNetworking', '~> 3.2.1'
   - Homepage: https://github.com/AFNetworking/AFNetworking
   - Source:   https://github.com/AFNetworking/AFNetworking.git
   - Versions: 3.2.1, ......,0.5.1 [master repo]
   - Subspecs:
     - AFNetworking/Serialization (3.2.1)
     - AFNetworking/Security (3.2.1)
     - AFNetworking/Reachability (3.2.1)
     - AFNetworking/NSURLSession (3.2.1)
     - AFNetworking/UIKit (3.2.1)

为解决将私有库中的代码分成不同的功能模块, 使用subspec语法配置podspec文件, 如下:

//格式:
s.subspec 'XXX' do |x|
    //需要导入的所有文件的相对路径
    x.source_files = '相对路径/**/*'
    //需要导入的.h头文件的相对路径
    x.public_header_files = '相对路径/**/*.h'
    //需要导入的资源文件的相对路径
    x.resource = "相对路径/**/*.{bundle,nib,xib}"
    //所依赖的其他的库
    x.dependency 'AFNetworking', '~> 1.0.0'
end

//示例:
s.subspec 'Network' do |n|
    n.source_files = 'XMGFMBase/Classes/Network/**/*'
    n.dependency 'AFNetworking'
end

私有库的资源引用

xib&storyboard

// MiddleView.m
    
NSBundle *mainBundle = [NSBundle mainBundle];
NSBundle *bundle = [NSBundle bundleForClass:self];
    
MiddleView *middleView = [[bundle loadNibNamed:@"MiddleView" owner:nil options:nil] firstObject];

// 打印一下上述两个bundle如下:
// mainBundle:
NSBundle </Users/xxx/Library/Developer/CoreSimulator/Devices/6B74958F-560F-4BF4-9BDF-9AD789379FC9/data/Containers/Bundle/Application/FC9747F0-8A82-4643-AC7E-BDC268190B8D/TitanFM.app>
// bundle:
NSBundle </Users/xxx/Library/Developer/CoreSimulator/Devices/6B74958F-560F-4BF4-9BDF-9AD789379FC9/data/Containers/Bundle/Application/FC9747F0-8A82-4643-AC7E-BDC268190B8D/TitanFM.app/Frameworks/TitanFMMain.framework>

图片资源

图片存放问题

s.resource_bundles = {
   'MainMoudle' => ['MainMoudle/Assets/*']
}

修改完配置信息和图片记得执行pod install把资源文件导入到项目中

私有库图片的使用

xib中加载图片, 需要在图片前面加上组件的主bundle, 类似: MainMoudle.bundle/tabbat_back

xibimage

私有库中使用代码加载图片, 一定不能使用imageNamed方法

//1. 获取当前的bundleName
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];

//2. 根据图片名称, 在bundle中检索图片路径
NSString *path = [currentBundle pathForResource:@"tabbar_np_play@2x.png" ofType:nil inDirectory:@"MainMoudle.bundle"];

//获取图片
UIImage *image = [UIImage imageWithContentsOfFile:path];

<div class="note warning"><p>引用图片需要注意的的是</p></div>

<div class="note info"><p>提交本地的私有库索引</p></div>

// 提交本地私有索引库需要忽略警告的命令
pod repo push TitanjunSpec MainMoudle.podspec --allow-warnings
podspec

相关参考


上一篇下一篇

猜你喜欢

热点阅读