随着公司项目的增多和业务的需求,各项目中相同模块的抽出和统一管理愈发重要,前段时间一直在进行一些尝试,现把过程中一些心得体会作为笔记记录下来,以便日后查阅纠正。
这里指只针对组件的依赖管理,至于组件化的具体实现方法逻辑和代码,又是一个庞大的话题,由于自身能力和时间有限,就不多作阐述了。
首先,我在公司内部组件的依赖管理上,只在 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/repospod 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'