分类
dev

Module模块化iOS开发的应用再回顾

Pre

2016年在华奥时, 在当时的项目需求下, 萌生了模块化设计的想法. 而思考如何划分各模块、各组件时, 写了篇文章: Module化的 iOS应用开发. 当时更多的是在思考划分界限, 然后用私有Cocoapods库进行组织的初实践. 而后来这个办法得到了实际使用的良好反馈, 我又将它逐步打磨. 形成了Core库(github)的设计. 可能是觉得和之前的文章内容并无实质上区别, 也就没有单独写一篇来记录. 现在想想, 其实这是前文设计的一个更完备的形式.

设计

如前文提到的, 使用私有的Cocoapods进行模块组合管理, 为了解耦关联, 这里采用Core核心库的形式:

graph TB
subgraph LYCore

  subgraph id31[Third-party Libs<br>]
  id311[AFNetworking]
  id312[LYCategory]
  id313[Realm]
  id314[...etc]
  id311---|sibling| id312
  id312---|sibling| id313
  id313---|sibling| id314
  end

  subgraph id32[Implementation<br>]
  id321[Networking Layer/API wrapper]
  id322[Persistence Layer/Database wrapper]
  id323[Configuration Layer]
  id324[Class Base]
  id321---|sibling| id322
  id322---|sibling| id323
  id323---|sibling| id324
  end

  subgraph id33[Resource<br>]
  id331[Bundle wrapper]
  id332[Image]
  id333[Font]
  id334[Sound]
  id335[...etc]
  id331---|sibling| id332
  id332---|sibling| id333
  id333---|sibling| id334
  id334---|sibling| id335
  end

end

核心库的实现中,

  • 持久化层, 数据库访问封装, 文件读写封装;
  • 配置层, 配置文件的访问封装;
  • 网络层, 包含了Server API的基础访问封装, 并可通过配置文件初始化;
  • 基类, 包含各种常用类的定义;

这样基于Core(核心)库, 可开始构建各个实际的功能模块(Module).

Module也以Cocoapods Library的形式创建, podspec里注明依赖于Core库.
构建在Core之上的Module, 可通过Core库访问Server API、了解当前用户鉴权状态、读写数据库、获取&调整配置等.
无需依赖其他模块.

App则最终以工程的形式创建, 通过Podfile选择所需的模块们(Modules).
这和使用其他的第三方库一样, 没什么区别.

整体架构大致如图:

graph TB
  id1["Module: LYCore<br>(git repo | pod lib)"]
  id11["Module: A<br>(git repo | pod lib)"]
  id12["Module: B<br>(git repo | pod lib)"]
  id13["Module: C<br>(git repo | pod lib)"]
  id14["Module: D<br>(git repo | pod lib)"]
  id15["Module: E<br>(git repo | pod lib)"]
  id21["App: 1<br>(git repo | project)"]
  id22["App: 2<br>(git repo | project)"]
  id1-->|podspec| id11
  id1 -->|podspec| id12
  id1 -->|podspec| id13
  id1 -->|podspec| id14
  id1 -->|podspec| id15
  id11 -->|podfile| id21
  id12 -->|podfile| id21
  id13 -->|podfile| id21
  id12 -->|podfile| id22
  id13 -->|podfile| id22
  id14 -->|podfile| id22
  id15 -->|podfile| id22

Author

Luo Yuluoyu@luoyu.space

分类
dev

About Cocoapods

关于安装Cocoapods

Cocoapods(后简称为pod)是一个Ruby程序, 当然可以在Gem里找到并安装.

但如果我们系统里有统一的包管理器Homebrew(后简称brew), 更应该经由它来安装, 这样也便于统一的管理版本, 以避免不同的包在不同的程序管理下的混乱局面.

通过brew安装pod就很简单:

brew install cocoapods

升级Cocoapods

随着Xcode及SDK的不断升级, Cocoapods也在跟着不断升级以适应项目生成.

所以我们一定要及时更新pod版本, 以免在Xcode升级后, 生成的xcodeprojpod有兼容问题.

如上所述, 通过brew安装的包, 也应该通过brew来管理版本, 升级也很简单:

# 先更新下brew的formula信息:
brew update
# 如果Cocoapods有可用更新上面的命令结果会展示出来.

# 想查看全部可更新的包:
brew outdated

# 更新Cocoapods
brew upgrade cocoapods

CDN

新的pod(1.9.x)已支持CDN加速, 不过目前也没用出速度区别来~

可以看到的改变在~/.cocoapods/repos/目录下,

  • 旧的 master仓库/trunk仓库 已经没了, 现在默认仓库名为cocoapods.
  • 新增一个trunk文件夹, 类别为CDN (https://cdn.cocoapods.org/), 此目录非git仓库.

实际使用下, pod install会从CDN读取以确定安装的库的版本.

也就是说, 库版本的确定现在的路径是:

Podfile.lock > CDN > cocoapods repo

如需更新必须使用pod update.

利用指定repo来加速

指定repo本是可以添加私有Spec仓库的.

例如我曾在某项目里用到:

Podfile:

source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/blodely/LYSpecs.git'
source 'https://e.g.some.company.git.server/PrivateSpecs.git'

来指定除了官方仓库外, 还有自己的LYSpecs仓库(里面有一些未推到官方的libs), 和公司的私有库(包含一些模块化的库, 但仅限公司内部访问).

source就可以指定多来源.

pod仓库在GitHub, 对于国内用户来说访问速度不是特别友好, 特别是Spec仓库目录及文件众多, 克隆和拉取都很慢, 容易因网络波动断开.

这样我们就可以用一些国内的Cocoapods spec的镜像来作为源.

应用起来很简单:

# 在Podfile首行加上你所想用的镜像地址

# 清华源
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git' 

# 或者码云的源
source 'https://gitee.com/mirrors/CocoaPods-Specs.git'

# 或者其他

注意找信得过源哦!~

推荐没什么大问题的情况下, 大家都使用官方源.

关于Repo仓库

用过pod searchpod repo add, 可能会找到在路径~/.cocoapods/repos/下的一些仓库.

它们事实上就是一个git管理的仓库, 包含了所有被提上去的pod库的spec等信息.

所以当我们对一个项目的Podfile运行pod install命令时, 它会知道每一个pod库应该从哪去获取.

search的索引

pod的spec仓库如此复杂而缓慢, 搜索如果是直接从中进行, 那效率会太低.

所以pod的做法是, 根据仓库创建一个用于搜索的索引文件(index), 然后使用索引来搜索(pod search).

这个文件位于~/Library/Caches/CocoaPods/search_index.json.

当首次克隆完spec仓库后执行搜索时, 或是添加了新的spec仓库后执行搜索时, 它都会出现一个Creating search index for spec repo 'xxx'..的等待过程.

如若遇到索引文件不正确的情况无法search, 可以删除该index, 让pod重新生成一个, 来修复该问题.

Author

Luo Yu

luoyu@luoyu.space

Wednesday, July 8, 2020

分类
dev

iOS Project with Dependency Manager

Notice: 当前Apple为Swift正在准备一套包管理器,详情参见Github

依赖管理器 Dependency Manager 和 包管理器 Package Manager 

Cocoapods 依赖管理器 Dependency Manager
cocoapods.org/
官方简介:

CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over eighteen thousand libraries and can help you scale your projects elegantly.

官方安装是通过gem源进行的。

但是有以下几点缺点:
gem install需要sudo权限。
默认的gem源https://rubygem.org/国内环境无法访问。淘宝提供的gem镜像也并不稳定。

使用Homebrew包管理器安装

关于Homebrew:(如果已用,请跳过此节)
brew.sh
官方的一点介绍:

Homebrew installs the stuff you need that Apple didn’t.

Homebrew installs packages to their own directory and then symlinks their files into /usr/local.

Homebrew won’t install files outside its prefix, and you can place a Homebrew installation wherever you like.

Trivially create your own Homebrew packages.

It's all git and ruby underneath, so hack away with the knowledge that you can easily revert your modifications and merge upstream updates.

Homebrew formulae are simple Ruby scripts

Homebrew complements OS X. Install your gems with gem, and their dependencies with brew.

强烈推荐Mac环境下使用Homebrew包管理器,而非MacPorts。
Homebrew已有的formula参见:
https://github.com/Homebrew/homebrew-core/tree/master/Formula

安装Homebrew:

Terminal(终端)中粘贴并运行此命令:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

以后需要查找包,直接使用搜索命令:
brew search …

安装包:
brew install …

检查Homebrew状态:
brew doctor

这里我们将使用Homebrew来安装Cocoapods。
brew search cocoapods
可以看到结果里有Cocoapods
那直接brew install cocoapods
等待安装完成~

测试一下Cocoapods是否安装成功,运行命令:
pod
返回结果里有pod正确的使用方法解释,看来是安装成功了。
以后pod升级也不用再sudo gem install了。

使用官方gem安装方法的请注意了:
Cocoapods安装需要sudo权限。但是平时pod时一定不要用sudo。
特别是第一次初始化pod repos的时候,如果使用sudo,将会导致一系列问题,(其实都是权限不对导致)。

使用brew install的,本身不用sudo,不用担心这个问题。

关于Spec repos
初次安装Cocoapods将会克隆一份spec repository到本地。
因为该项目又大文件夹又多,可能容易中断。

实际Spec项目就在Github,链接:
https://github.com/CocoaPods/Specs.git
可以git clone该项目到本地,或者下载zip文件的方式获取它。

将整个repo命名成master,然后放到~/.cocoapods/repos/下即可。

这个时候,再跑一遍命令以完成Cocoapods的初始化:
pod setup

来替代Spec仓库初始化命令的操作。

使用Cocoapods控制第三方库依赖

在Xcode Project目录下,运行pod init命令,将初始化一个Podfile文件。

向其中添加pod库即可。

修改完成后,运行pod install命令,将依据此Podfile生成工程 workspace,包含配置好的所有库。

命令都会输出应有的操作提示。

Where To Go

关于该依赖管理器,还有很多运用,比如自建私有的Pods仓库,本地引用,透过Git引用等。

骆昱
2016-07-05