最近在学习vue.js
的时候发现,vue
的组件化的思想对于编写代码是一个非常有用的事情。
首先为什么需要组件化?
下面我列举了一些比较常见的问题
- 业务模块划分不清楚,各模块之间耦合度很大,难以维护
- 例如我们公司的商城项目随着功能和时间,代码量越来越大,早期的一些代码已经不需要了,但是不敢轻易删除,不敢保证该文件是够有被使用。
- 就算手动去查找删除,也是一件治标不治本的方法,等过一段时间还会出现这种问题
- 所有模块代码都编写在一个项目中,测试某个模块或功能的时候,需要编译运行整个项目
- 这一点在做自动化测试的时候尤其明显,如果某个地方出现问题,现在就无法再继续进行测试了
- 复用性不好,需要经常造轮子
- 在我们的项目中,如果之前的开发人员离职了,那么他造过哪些轮子,经常后续的开发人员是不了解不清楚的。
- 如果又需要做一些类似的功能,新的开发人员有需要重复造轮子
- 开发效率很低,分工不明确
- 如果有新人加入项目,不能保证可以立刻投入开发。需要较长的时间来熟悉代码,且新人在熟悉代码的过程也容易走弯路。
组件化解决问题的思路
利用中间层来做到:只让别的模块对中间层产生耦合,中间层不对其他模块产生耦合
关于这个中间层,这个问题在这里我们就不深究了,大家可以参考蘑菇街解决思路。
组件化的目的
我们可以讲每一个模块作为一个组件。并且建立一个主项目,这个朱羡慕负责集成所有组件。
好处:
- 业务划分清晰,新人接受项目容易,不同的组件是不同的开发任务,大组件下的小组件是一个小的开发任务
- 项目维护性更强,需要什么功能,很好找到,提高了开发的销量。
- 能够更好的发现问题并找到问题,当某个地方出现问题了,可以直接对该组件进行处理,处理好了更新组件就好。
- 开发和测试的时候,可以只编译自己写的代码,不需要编译全部项目。测试人员也可以测试单个组件。
在这里需要解释一下什么是组件?
一个分类可以是一个组件,一个轮播图也可以是一个组件,一个Controller
也是一个组件,甚至一个首页模块(包含内部的所有Controller
和业务),都可以是一个组件。
像分类这种被称为基础组件,轮播图这种被称为UI
组件,Controller
和首页模块这种被称为业务组件。从前到后,从简单到复杂,都是组件。
我们应该怎么做?
在组件化的架构中,有一个主项目用来负责集成其余组件。每一个组件又是一个单独的工程。
组件只需要对外提供服务,通过中间件来调用这些服务。
在这里将通过iOS
的cocoapods
私有库的形式来完成一个组件化的示例。
以cocoapods
的AFNetworking
为例。
[cocoapods的Specs索引]-->(AFNetworking的配置信息)-->C(AFNetworking的具体代码)
当我们使用pod search AFNetworking
的时候,就是去cocoapods
的Specs
索引中找到AFNetworking
的配置信息,然后通过这个配置信息,配置信息包含的在github
上的代码地址,去获得对应的代码。
现在我们要做的就是按照cocoapods
官方的这一套来生成我们自己的一套,我们自己生成一个非官方的Specs
索引,在这个索引里只存放公司的库索引,也就是一个个组件,这些组件的具体地址,放到我们想放到的地址下面。如coding
私有库,码云,公司部署的gitlab
等。
简单的来说就是仿照上图的这三个东西。
准备工作
本地的cocoapods
必须要安装好,这里有篇文章写得很好,我就不复述了。文章地址:如何安装cocoapods
详细步骤
-
编写组件代码,比如一个轮播图,一个数据库工具等,具体写代码的过程就不说了,这里我使用小码哥的代码来做示范,因为这个实践的文档也是基于一位讲师的文章来做的。
下面是编写好的代码,在这里分了两个模块,一个是
Base
,一个是Category
。这两个模块不依赖于任何别的第三方文件和库。
-
建立自己的
Spec
索引,这里我们建立在码云上,因为码云免费且没有项目个数的限制。在这里我的Spec
项目名为LJDemoSpecs
,这里我没有添加ReadMe
和.gitignore
文件。
这里会验证一下用户名和密码,报错的原因是由于钥匙串中存储着多个
oschina
的用户名和密码,删掉不用的那个就行了。liangdeiMac:~ apple$ pod repo add LJDemoSpecs https://git.oschina.net/dev_liang152/ljdemospecs.git Cloning spec repo `LJDemoSpecs` from `https://git.oschina.net/dev_liang152/ljdemospecs.git` [!] /usr/bin/git clone https://git.oschina.net/dev_liang152/ljdemospecs.git LJDemoSpecs Cloning into 'LJDemoSpecs'... fatal: Authentication failed for 'https://git.oschina.net/dev_liang152/ljdemospecs.git/' liangdeiMac:~ apple$ pod repo add LJDemoSpecs https://git.oschina.net/dev_liang152/ljdemospecs.git Cloning spec repo `LJDemoSpecs` from `https://git.oschina.net/dev_liang152/ljdemospecs.git` Username for 'https://git.oschina.net': 152XXXXXX@163.com Password for 'https://152XXXXXX@163.com@git.oschina.net':
现在前往电脑中的个人下的
.cocoapods
文件夹,可以看到repos
下面有两个文件夹,一个是master
,一个是LJDemoSpecs
。master
是cocoapods
的官方索引库,而LJDemoSpecs
是刚才我们建立的私人的索引库,现在里面还什么都没有。这里想要查看
.cocoapods
文件夹需要开启显示隐藏文件的权限 -
现在利用
pod
来生成一个组件化的项目,这个项目的名字叫做LJDemoBase
。这里不通过
xcode
来建立project
,而是使用pod
命令来直接生成组件化的项目。这里的命令就是
pod lib create LJDemoBase
,它会从cocoapods
的模板中给你clone一个项目。- 询问你使用的语言
- 是否需要
demo
工程 - 是否使用测试
framework
- 是否基于
View
测试 - 类的前缀
输入完毕后稍等片刻,
xcode
会自动打开这个项目liangdeiMac:~ apple$ cd /Users/apple/Documents/LJDemo liangdeiMac:LJDemo apple$ pod lib create LJDemoBase Cloning `https://github.com/CocoaPods/pod-template.git` into `LJDemoBase`. Configuring LJDemoBase template ------------------------------ To get you started we need to ask a few questions, this should only take a minute. If this is your first time we recommend running through with the guide: - http://guides.cocoapods.org/making/using-pod-lib-create.html ( hold cmd and double click links to open in a browser. ) What language do you want to use?? [ Swift / ObjC ] > objc Would you like to include a demo application with your library? [ Yes / No ] > yes Which testing frameworks will you use? [ Specta / Kiwi / None ] > none Would you like to do view based testing? [ Yes / No ] > no What is your class prefix? > LJ Running pod install on your new library. Analyzing dependencies Fetching podspec for `LJDemoBase` from `../` Downloading dependencies Installing LJDemoBase (0.1.0) Generating Pods project Integrating client project [!] Please close any current Xcode sessions and use `LJDemoBase.xcworkspace` for this project from now on. Sending stats Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed. Ace! you're ready to go! We will start you off by opening your project in Xcode open 'LJDemoBase/Example/LJDemoBase.xcworkspace' To learn more about the template see `https://github.com/CocoaPods/pod-template.git`. To learn more about creating a new pod, see `http://guides.cocoapods.org/making/making-a-cocoapod`.
-
下面是自动生成的
pod
项目的目录结构-
Example
主要存放对应的demo
-
LJDemoBase
主要存放代码和需要的资源 - 而
podspec
文件则是记录着当前组件的相关信息,包括git
地址,对应的描述,需要依赖的库等等
-
-
现在把第一步中的代码添加到这个
pod
项目中,添加代码的方法有好几种,这里我仅仅写我使用的方法。-
在对应的
Example
中编写调试代码,编写完成后如下图所示 -
代码已经写完了,也调试好了。现在将对应的代码放到
LJDemoBase
下的Classes
文件夹下,将Classes
下已有的Relpace
文件删除。这里我们直接在
finder
里操作,不是在Example
的workspace
操作。 -
现在删除
Example
项目中的的Base
和Category
,然后在Example
目录下使用命令pod install
。对应的结果如下liangdeiMac:Example apple$ pod install Analyzing dependencies Fetching podspec for `LJDemoBase` from `../` Downloading dependencies Using LJDemoBase (0.1.0) Generating Pods project Integrating client project Sending stats Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
-
再次查看
LJDemoBase.xcworkspace
,可以看到对应的代码已经自动被放到Development Pods
下面了。
-
-
现在如果这就是我们这个小组件的第一个版本,当前代码只是写在本地,需要将他放到远程仓库上。我们在
gitoschina
建立一个对应的仓库。建立好以后如下图所示:
这里任然不添加
ReadMe
和.gitignore
文件,因为pod lib create
创建的项目里已经有这两个文件了 -
代码虽然已经写完了,但是对应的配置信息却一点都没有写,现在来把配置信息补齐。
Pod::Spec.new do |s| s.name = "PodTestLibrary" #名称 s.version = "0.1.0" #版本号 s.summary = "Just Testing." #简短介绍,下面是详细介绍 s.description = <<-DESC Testing Private Podspec. * Markdown format. * Don't worry about the indent, we strip it! DESC s.homepage = "https://coding.net/u/wtlucky/p/podTestLibrary" #主页,这里要填写可以访问到的地址,不然验证不通过 # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截图 s.license = 'MIT' #开源协议 s.author = { "wtlucky" => "wtlucky@foxmail.com" } #作者信息 s.source = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" } #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS # s.social_media_url = 'https://twitter.com/<twitter_username>' #多媒体介绍地址 s.platform = :ios, '7.0' #支持的平台及版本 s.requires_arc = true #是否使用ARC,如果指定具体文件,则具体的问题使用ARC s.source_files = 'Pod/Classes/**/*' #代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置 s.resource_bundles = { 'PodTestLibrary' => ['Pod/Assets/*.png'] } #资源文件地址 s.public_header_files = 'Pod/Classes/**/*.h' #公开头文件地址 s.frameworks = 'UIKit' #所需的framework,多个用逗号隔开 s.dependency 'AFNetworking', '~> 2.3' #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency end
在上面已经将对应的参数通过备注的形式解释了,下面我贴一下我这个组件的
podspec
的截图,划线部分是修改过的地方。
由于不要依赖第三方库和别的资源文件,因此
s.dependency
和s.resource_bundles
都没有打开注释。 -
现在本地
LJDemoBase
代码和对应LJDemoBase
的podspec
都搞好了,LJDemoBase
的远程仓库也建立好了,现在把本地和远程的库关联起来。下面的操作基于
LJDemoBase
主文件夹:liangdeiMac:LJDemoBase apple$ git add . liangdeiMac:LJDemoBase apple$ git commit -m"initial LJDemoBase with first version" liangdeiMac:LJDemoBase apple$ git remote add origin https://git.oschina.net/dev_liang152/ljdemobase.git git push origin master
-
做完上面的这些操作,再来看
oschina
上的对应仓库,对应的内容已经全部同步了现在本地和远程仓库已经关联了
-
在我们使用
cocoapods
的过程中,常常会发现当搜索某个库的时候会有对应的Version
,可以使用指定版本的代码来集成到项目中,如下图所示-> AFNetworking (3.1.0) A delightful iOS and OS X networking framework. pod 'AFNetworking', '~> 3.1.0' - Homepage: https://github.com/AFNetworking/AFNetworking - Source: https://github.com/AFNetworking/AFNetworking.git - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo] - Subspecs: - AFNetworking/Serialization (3.1.0) - AFNetworking/Security (3.1.0) - AFNetworking/Reachability (3.1.0) - AFNetworking/NSURLSession (3.1.0) - AFNetworking/UIKit (3.1.0)
Version
对应相关版本的代码,通过git tag
的形式来做到区分版本。下面我们也给当前的代码制定一下版本,命令非常简单,如下所示就是打了个0.1.0的
tag
liangdeiMac:LJDemoBase apple$ git tag liangdeiMac:LJDemoBase apple$ git tag 0.1.0 liangdeiMac:LJDemoBase apple$ git tag 0.1.0 liangdeiMac:LJDemoBase apple$ git push --tags Total 0 (delta 0), reused 0 (delta 0) To https://git.oschina.net/dev_liang152/ljdemobase.git * [new tag] 0.1.0 -> 0.1.0
查看远程仓库,可以看到这就是刚才的
tag
-
现在一切准备就绪,需要将我们写的这个组件的配置信息加入到私有的
pod
索引里去,也就是第二步中那个Spec
索引。
还是在当前打tag
的目录执行下面的命令liangdeiMac:LJDemoBase apple$ pod repo push LJDemoSpecs LJDemoBase.podspec Validating spec -> LJDemoBase (0.1.0) - WARN | url: The URL (https://git.oschina.net/dev_liang152/ljdemobase) is not reachable. Updating the `LJDemoSpecs' repo Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched. Adding the spec to the `LJDemoSpecs' repo - [Add] LJDemoBase (0.1.0) Pushing the `LJDemoSpecs' repo To https://git.oschina.net/dev_liang152/ljdemospecs.git * [new branch] master -> master
下面来看看本地和远程的索引库,发现现在都有啦
上面的命令会自动帮我们同步到本地和远程
-
下面来检索这个
LJDemoBase
,发现搜索不到,这是缓存的问题输入
rm ~/Library/Caches/CocoaPods/search_index.json
然后重新搜索,如下-> LJDemoBase (0.1.0) LJDemoBase基础组件 pod 'LJDemoBase', '~> 0.1.0' - Homepage: https://git.oschina.net/dev_liang152/ljdemobase - Source: https://git.oschina.net/dev_liang152/ljdemobase.git - Versions: 0.1.0 [LJDemoSpecs repo]
-
现在通过
xcode
建立主工程LJDemoProject
,建立好项目之后使用pod
初始化后如图
-
打开
LJDemoProject.xcworkspace
,编辑Podfile
文件,添加source
添加
source
的目的:默认情况下cocoapods
指定使用官方的索引,这里我们不仅要使用官方,也要使用个人私有的索引修改后的文件内容如下:
至于怎么看
source
的地址,使用下列命令pod repo
liangdeiMac:LJDemoBase apple$ pod repo LJDemoSpecs - Type: git (master) - URL: https://git.oschina.net/dev_liang152/ljdemospecs.git - Path: /Users/apple/.cocoapods/repos/LJDemoSpecs master - Type: git (master) - URL: https://github.com/CocoaPods/Specs.git - Path: /Users/apple/.cocoapods/repos/master 2 repos
-
现在在
Podfile
文件的的父目录下pod insatll
liangdeiMac:LJDemoProject apple$ pod install Analyzing dependencies Downloading dependencies Installing LJDemoBase (0.1.0) Generating Pods project Integrating client project Sending stats Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
打开
LJDemoProject.xcworkspace
会看到如下图所示,这样我们的组件就被集成进项目里了
到这里我们制作集成组件就讲的差不多了,下面是补充一些相关的东西
- 如何细分组件,给组件划分模块
- 如何给组件添加依赖
- 如何更新组件
- 如何给组件添加资源文件
- 多人协作开发时,如何做到组件化开发
细分组件
在组件的开发过程中,常常会对组件进行结构划分,例如上面的组件划分为Base
和Category
,虽然在物理文件夹上将这两个模块的代码分开了。但是在使用代码的过程中却并没有分开,就像15步的最后那张图,这两部分的代码最后被一起放到了LJDemoBae
下。
其实在使用cocoapods
的过程中,会发现有一个Subspecs
字段,这就是对应的组件细分,如下面的AFNetworking
所示。
-> AFNetworking (3.1.0)
A delightful iOS and OS X networking framework.
pod 'AFNetworking', '~> 3.1.0'
- Homepage: https://github.com/AFNetworking/AFNetworking
- Source: https://github.com/AFNetworking/AFNetworking.git
- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1,
2.6.0, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0,
2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0,
1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
- Subspecs:
- AFNetworking/Serialization (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Reachability (3.1.0)
- AFNetworking/NSURLSession (3.1.0)
- AFNetworking/UIKit (3.1.0)
下面要做到导入组件的时候会自动将已经划分好的目录结构导入,并且还能够按需导入,比如说我只需要
Base
那么可以只导入该组件下的Base
,而不会将其他文件导入。
其实文件的目录划分在上面已经做好了(这里我是之前划分好了,你如果没划分是要划分的),现在这里只需要配置一下Specs
就可以了。
-
如下图所示,修改的地方我都已经标注好了
-
现在提交新的代码,提交代码加打
tag
都放在下面了liangdeiMac:LJDemoBase apple$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: LJDemoBase.podspec no changes added to commit (use "git add" and/or "git commit -a") liangdeiMac:LJDemoBase apple$ git add . liangdeiMac:LJDemoBase apple$ git commit -m"组件内部划分" [master 4df9fec] 组件内部划分 1 file changed, 12 insertions(+), 3 deletions(-) liangdeiMac:LJDemoBase apple$ git push Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 393 bytes | 0 bytes/s, done. Total 3 (delta 2), reused 0 (delta 0) To https://git.oschina.net/dev_liang152/ljdemobase.git d0dae77..4df9fec master -> master liangdeiMac:LJDemoBase apple$ git tag 0.1.0 liangdeiMac:LJDemoBase apple$ git tag 0.2.0 liangdeiMac:LJDemoBase apple$ git push --tags Total 0 (delta 0), reused 0 (delta 0) To https://git.oschina.net/dev_liang152/ljdemobase.git * [new tag] 0.2.0 -> 0.2.0
-
更新
spec
索引pod repo push LJDemoSpecs LJDemoBase.podspec
。liangdeiMac:LJDemoBase apple$ pod repo push LJDemoSpecs LJDemoBase.podspec Validating spec -> LJDemoBase (0.2.0) - WARN | url: The URL (https://git.oschina.net/dev_liang152/ljdemobase) is not reachable. Updating the `LJDemoSpecs' repo Already up-to-date. Adding the spec to the `LJDemoSpecs' repo - [Update] LJDemoBase (0.2.0) Pushing the `LJDemoSpecs' repo To https://git.oschina.net/dev_liang152/ljdemospecs.git 01c7cdf..f2bb526 master -> master
-
搜索组件
pod search ljdemobase
,如下图所示,现在的Versions
有0.1.0和0.2.0,且Subspecs
有Base
和Category
了。-> LJDemoBase (0.2.0) LJDemoBase基础组件 pod 'LJDemoBase', '~> 0.2.0' - Homepage: https://git.oschina.net/dev_liang152/ljdemobase - Source: https://git.oschina.net/dev_liang152/ljdemobase.git - Versions: 0.2.0, 0.1.0 [LJDemoSpecs repo] - Subspecs: - LJDemoBase/Base (0.2.0) - LJDemoBase/Category (0.2.0)
-
现在更新一下项目中使用到的组件,
pod update --no-repo-update
,至于为什么要加后面的参数是因为不如不加的话会更新pod
官方索引,需要的时间比较长,我们不想更新官方的索引。liangdeiMac:LJDemoProject apple$ pod update --no-repo-update Update all pods Analyzing dependencies Downloading dependencies Installing LJDemoBase 0.2.0 (was 0.1.0) Generating Pods project Integrating client project Sending stats Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
-
现在再看一下项目中用到的这个组件,发现现在对应的目录结构已经分好了。
如果现在只想使用组件中的一个子组件,那么在
Podfile
中可以写作如下所示修改完毕以后再使用
pod update --no-repo-update
重新安装一下依赖组件即可
如何给组件添加依赖
在制作组件的过程中,常常需要依赖一些第三方的框架,常见的如AFNetworking
和SDWebimage
等,下面讲解一下如何添加依赖。
-
添加依赖的是公开的代码,如
AFNetworking
-
添加的配置信息是写在组件的
podspec
文件里,很简单如下所示
-
更新到远程仓库,打
tag
并更新Spec
索引liangdeiMac:LJDemoBase apple$ git add . liangdeiMac:LJDemoBase apple$ git commit -m"添加AFNetworking的依赖" liangdeiMac:LJDemoBase apple$ git push liangdeiMac:LJDemoBase apple$ git tag 0.3.0 liangdeiMac:LJDemoBase apple$ git push --tags liangdeiMac:LJDemoBase apple$ pod repo push LJDemoSpecs LJDemoBase.podspec
-
在项目中使用新版本的组件,下面的命令是在
LJDemoProject
项目下liangdeiMac:LJDemoBase apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
执行完上面的命令,现在来看一下项目中的依赖库
-
如果需要给某个组件的子组件添加依赖库,那么
podspec
文件写作如下所示这里我只截图了
spec
文件的内容,对应添加代码的工作这里就不演示了 -
上面的工作都做完以后,现在执行我们的更新组件三部曲
-
推送组件代码到远程,打
tag
,这里我直接贴图了,下面的命令在上面的讲解中我已经讲过很多次了 -
更新
spec
索引pod repo push LJDemoSpecs LJDemoBase.podspec
。 -
先修改
LJDemoProject
项目中的Podfile。这里分两种,一种子组件不依赖第三方,一种的子组件依赖第三方
- 不依赖第三方,
pod 'LJDemoBase/Category'
- 依赖第三方,
pod ‘LJDemoBase’, :subspaces =>[‘Category’, ‘Network’]
- 不依赖第三方,
在项目中使用新版本的组件,下面的命令是在
LJDemoProject
项目下liangdeiMac:LJDemoBase apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
- 子组件不依赖第三方
- 子组件依赖第三方
可以很清晰的看到,子组件如果依赖第三方库,当使用子组件的时候会自动帮我们安装依赖的三方库,而如果没有使用依赖三方库的子组件,并不会安装对应的第三方库
-
-
-
添加依赖的是私有库,比如前面写了个
LJDemoBase
,现在又要创建一个新的组件叫LJDemoView
,它依赖于LJDemoBase
-
在
LJDemoView
的Podfile
中添加对应的私有pod
索引,如下图所示看清楚,这里是
LJDemoView
的Podfile
-
在
LJDemoView
的LJDemoView.podspec
下添加依赖,下图中不仅添加了依赖,描述,git地址等配置信息都填好了(因为这是一个新的组件)
-
推送代码到远程仓库,打
tag
并更新Spec索引,下面我只贴命令了,相信大家已经知道用什么命令了(前面敲了n次)liangdeiMac:LJDemoView apple$ git add . liangdeiMac:LJDemoView apple$ git commit -m"initial LJDemoView with first version" liangdeiMac:LJDemoView apple$ git remote add origin https://git.oschina.net/dev_liang152/ljdemoview.git liangdeiMac:LJDemoView apple$ git push origin master liangdeiMac:LJDemoView apple$ git tag liangdeiMac:LJDemoView apple$ git tag 0.1.0 liangdeiMac:LJDemoView apple$ git push --tags liangdeiMac:LJDemoView apple$ pod repo push LJDemoSpecs LJDemoView.podspec
-
在
LJDemoProject
下的Podfile
中添加新的组件,这里为了区别之前的LJDemoBase
组件,把之前的组件注释掉liangdeiMac:LJDemoView apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
-
组件直接的相互依赖就说到这里,如果还有问题可以参看下面的官方文档的介绍
如何更新组件
添加对应的代码,修改
podspec
文件,推送到远程打
tag
并推送tag
更新
spec
索引,如pod repo push LJDemoSpecs LJDemoBase.podspec
-
使用组件,在项目的
Podfile
中添加我这里只是写的大体步骤,具体步骤上面做了很多次了,相信都已经很了解了
如何给组件添加资源文件
在开发组件的过程中,常常需要用到一些资源文件,常见的如图片,xib
等。
这里我就不花大篇幅来讲了,大家可以看这个老师写的添加组件资源的博客
多人协作开发时,如何做到组件化开发
经过上面的讲解,相信大家应该知道怎么来制作更新一个组件了,但是上面的一切都是基于个人的操作,如何在团队中能够开发并使用是接下来讨论的问题。
这里我是基于oschina
建立了一个组织,组织里就是公司的同事。
完成后的组织结构如下图所示
重要:下面的操作是在另一位同事的电脑上,这个同事叫MT
-
将
LJDemoSpecs
的内容clone
到本地。这里的本地地址为:前往电脑中的个人下的.cocoapods文件夹,可以看到repos下面有一个文件夹master,master里存放的官方的库索引,我们现在要加入组织的私有库索引
LJDemoSpecs
。下面我贴下命令
待修改 MTdeiMac:~ apple$ cd /Users/apple/.cocoapods/repos MTdeiMac:repos apple$ git clone https://git.oschina.net/j1-iOS/ljdemospecs.git
做完上面的操作,如下图所示
现在通过
pod repo
可以看到有两个库索引,如下图
待修改
现在可以把放在
oschina
上的组件和项目都clone下来,然后和文章前面所讲的一样来进行组件的开发和项目的开发了。最后给大家看一下通过组件化开发以后的完整项目的目录结构。
-
该项目来自小码哥的一个组件化开发后的项目
参考资料: