组件化最近比较火的理念之一.通常为了增加代码的可维护性, 减少各个业务和模块之间的耦合度. 我们会在做项目的过程中, 会将各个模块独立出来做成一个类似SDK的东西, 以减少我们的使用难度和维护难度.
要将我们的模块做成一个可以通过cocopods管理和引用的私有项目需要几个步骤.
第一步:
因为是私有库 ,通常我们的代码都会放在自己公司的代码托管服务器上. 那么第一步我们要在自己公司的代码托管服务器上搭建一个用来管理私有库的库, 这个库类似于CocoaPods
的官方spec repo
. Spec Repo是一个包含了各种支持CocoaPods导入的类库的一个仓库,官方的Spec Repo是一个在github上的git repo,在我们安装CocoaPods时进行 pod setup
步骤时会将其clone到本地目录 ~/.cocoapods/repos/master
下。
那么首先我们要在自己公司的服务器上创建一个私有的
Spec Repo
库来管理我们的私有库. 我建的私有的Spec Repo
库叫做QMSpecRepo
.如何让我们创建的管理库生效呢?需要执行下面这个指令
pod repo add QMPodspec https://git.xxxxxx.com/XXXX/Podspec.git
这条指令会在本地.cocoapods/repos
目录下添加我们管理库的数据. 这样我们在执行pod install 私有库
的时候就可以找到我们的私有库.
第二步:
创建我们的私有库. 并设置我们的私有库可以通过cocopods管理和引用.
具体可以参考:如何将自己的项目添加Pod
只不过这篇文章中是在github上创建仓库, 而我们是在自己公司的服务器上创建仓库. 私有仓库创建并搭建好之后, 最后需要注意的一个重点就是: 在执行上传指令的时候,因为我们是发布到自己的私有服务器上,因此具体指令如下:
pod repo push QMSpecRepo APIManager.podspec
一定要将我们的库push到自己的服务器上的仓库管理的库上.
第三步:
引用我们在自己公司的服务器上创建的私有库. 这里也有一个注意的点就是在Podfile
文件里引用我们自己的私有库的时候不能简单的通过
pod 'APIManager', '1.0.0'
来引用, 这样是无法引用成功的必须要在Podfile
文件的顶部假如我们管理私有库的库的地址.
这里还有一个坑, 与此同时, 只在
Podfile
文件的顶部引入我们自己的管理库的库的地址是不够的还需要加入github的管理库的库的地址. 不然会导致github上的开源库我们无法引用.
至此, 私有库搭建完成! 我们可以在项目里开心加愉快的使用在我们自己的代码托管服务器上搭建的私有库了!
补充:
在后来使用的过程中遇到了Pod include of non-modular header inside framework module
的错误, 搞了半天没过出来, 最后在解决 Pod include of non-modular header inside framework module 错误
找到了解决办法.
在pod lib lint
后面加上--use-libraries
和 --allow-warnings
注意:
因为我们的私有库比较多, 所以在后面创建的私有库需要依赖前面创建的私有库的时候. 当我在IAP.podspec
里面添加私有库依赖
后面执行
pod lib lint
的时候报错, 找不到QMAPIManager.h
这个文件后来, google发现在执行pod lib lint
命令的时候, 需要在后面加上私有库的source
地址, 但是只加私有库的地址还是不通过, 因为这个时候又找不到github
上公有库的地址, 所以这就需要我们学会sources
参数的用法, sources
是个复数, 意味着后面可以跟多个值. 比如:--sources=https://git.quanmin.tv/QMLive/QMPodspec.git,https://github.com/CocoaPods/Specs.git
.所以当我们的库既依赖私有库, 又依赖公有库的时候我们只需要执行
pod lib lint --sources=https://git.quanmin.tv/QMLive/QMPodspec.git,https://github.com/CocoaPods/Specs.git
就不会出现找不到私有库及公有库的问题了.
坑:
在制作分享组件的时候在QMShareKit.podspec
用到了友盟分享的SDK
然后在执行
pod install
跑demo
的过程中, 报错:The 'Pods-QMShareKit_Example' target has transitive dependencies that include static binaries:
最后通过google找到的解决办法是, 把Podfile
文件里的use_frameworks!
去掉.
再次执行pod install
, 大功告成!
坑2:
上面的方法把Podfile
文件里的use_frameworks!
去掉, run
demo 的时候会报找不到自己当前的framework
.
所以还不能按照上面的方法做.
这个时候需要我们将友盟的静态库, *.a
文件下载下来, 然后在QMShareKit.podspec
里添加自定义的静态库.
再次
run
demo, build success.
坑3:
后来在封装分享模块的时候需要用到, CocoaPods 动/静态库混用封装组件化
参考文章:CocoaPods应用篇之搭建并发布自己的私有库
参考文章:利用CocoaPods创建私有库
使用cocoapods打包静态库(依赖私有库,开源库,私有库又包含静态库)
使用私有Cocoapods仓库 中高级用法
补充:
通过'pod'命令:
pod lib create xxxxx
可以快速创建项目