随着公司项目的增多和业务的需求,各项目中相同模块的抽出和统一管理愈发重要,前段时间一直在进行一些尝试,现把过程中一些心得体会作为笔记记录下来,以便日后查阅纠正。
这里指只针对组件的依赖管理,至于组件化的具体实现方法逻辑和代码,又是一个庞大的话题,由于自身能力和时间有限,就不多作阐述了。
首先,我在公司内部组件的依赖管理上,只在 Git
的 submodule
、 subtree
和Cocoapods
当中进行了考察和比对。
submodule
之前项目中一直使用的这种方式,主要原理是把一个子模块 Git
仓库引入到工程 Git
仓库,2 个仓库代码文件独立管理,协同工作。
优点
- 各项目中的成员都可以在自己项目中提交更新到组件仓库,方便协同开发和完善组件
- 组件仓库在有更新之后,各项目能自动收到更新提示(我们公司使用了
SourceTree
),以便及时更新到最新
缺点
- 增删组件较为繁琐,版本管理不直观
subtree
原理是将一个子模块 Git
仓库的某个 commit 版本 提交拷贝一份到工程 Git
仓库。
优点不显著,缺点明显:对于贡献代码不太友好,团队成员在自己的项目中修改组件后,无法提交到组件仓库。当然,也可能是我没有掌握 subtree
的正确操作方法,没有体会到它的其他好处,总之没有使用这种方式。
Cocoapods
一款优秀的框架管理工具,功能强大
优点
- 可以一行命令增删组件,方便快捷直观
- 可以管理组件之间的依赖关系
缺点:
- 贡献代码不太友好,项目中修改后不能提交更新到组件仓库
- 组件代码更新后,项目无法自动收到更新提示,必须手动执行
pod update
操作
虽然 Cocoapods
无法方便的在项目中提交更新,组件仓库需要专门维护更新,但是随着组件的成熟和增多,这种方式显然比前 2 种更为方便和适用。
私有库制作
Cocoapods
可将组件制作成私有库进行版本管理,相关优质教程很多,可参考
使用Cocoapods创建私有podspec
Cocoapods系列教程(三)——私有库管理和模块化管理
CocoaPods安装使用及配置私有库
注意点 & 小技巧
-
组件仓库修改代码
push
更新版本后,不要忘记打tag
,并且更新podspec
-
提交私有
podspec
时直接用pod repo push
提交,不要直接进行git
操作 -
pod install
只是用于增减pod
,然后把各个pod
的版本信息写入Podfile.lock
文件
如果pod
有新版本了,只要不执行pod install
更新Podfile.lock
,pod
也不会主动更新 -
本地
podspec
保存在~/.cocoapods/repos
-
pod install
时,如果有要求特定source
,会先查找~/.cocoapods/repos
路径下有没有这个source
的repo
,如果有就直接使用 。如果没有,会创建这个source
的repo
,自动起的名字可能会有点奇怪
-
pod repo push
后,如果有自己创建的repo
文件夹,一定要更新这个repo
,否则pod update
私有库可能无法更新到最新版本
-
~/Library/Caches/CocoaPods/Pods
是Spec
和 各种Git
库的缓存,CocoaPods
使用过程中会优先从缓存中寻找spec
和代码库,找不到相应版本时才会去远程拉取。其中,External
文件夹是lint
或push
时sepc
的临时代码库,Release
文件夹是发布过的代码库
- 编写
podspec
的小 tips -
s.source_files = "*"
表示根目录下所有文件。 -
s.source_files = "**/*"
表示根目录及其子目录下所有文件,/
必须是英文状态下的 - 主 spec 涵盖了的
source_files
子 spec 就不会导入了 -
s.resource = "*.bundle"
可以把根目录下 bundle 资源文件加进来 -
s.resource = "*"
会把代码文件也会加进来
-
个人建议将
Pod
文件夹纳入Git
版本管理优点
-
对
Pod
中的源代码的改动可以记录下来,否则改动后进行pod update
就可能丢失 -
如果
Pod
远程源代码丢失,本地还有备份 -
git clone
下来项目就能直接运行,无需再pod install
缺点
-
项目占用空间增加
-
私有库的开发模式
当然,在使用私有库的过程中,很大一部分时间私有库都是处于开发阶段,而我们总不能一直提交 tag 的方式进行 pod update 更新吧。因此 Cocoapods 就提供了一个开发模式,其实操作起来也是非常简单的事情,就是将所谓的引用路径修改成本地路径即可。就是讲 Podfile 中的 pod '库名', :path => '本地路径'即可。这样在通常的修改代码中是不需要执行 pod update 的,但是对于如果修改了目录结构(添加、删除或者移动文件文件)或者是修改了 Podspec 文件的配置的话,最好是运行一下 pod update 的命令。普通修改代码的情况下就不需要运行 pod update 命令和打 tag 了。
如 pod 'iOS-Echarts', :path => '../iOS-Echarts'
网友评论