iOS组件化 (pod私有库,包含静态库)

因项目业务的不断发展,应用的代码体积越来越大,代码耦合也较为严重,所以考虑先对各模块进行解耦,然后通过pod私有库来进行管理,如此每一个模块都可以单独运行。这篇文章就详细介绍如何建立远程pod私有库,以及使用。

创建远程私有库有以下几个步骤:

  • 创建一个远程仓库,作为私有的repo索引库
  • 创建一个远程仓库,作为我们需要封装的模块组件仓库(存放待封装的项目文件,需要拆分成几个模块就要需要几个仓库,这里以一个为例)
  • 添加文件到组件仓库,配置 pod.spec 文件,并上传至pod远程私有库
  • 添加tag,并推送至远端私有库(tag要与.podspec文件中的version保持一致)
  • 向私有的Repo索引库提交podspec
  • pod私有库的使用
  • pod私有库的更新

1. 创建两个远程仓库

创建YMSpecRepo远程仓库,用来作为索引库。
创建YMCommonViewLib远程仓库,用来存放项目工程文件。(YMSpecRepo和YMCommonViewLib是我为了让大家看的更清楚设的名字)

2. 创建spec Repo 本地索引

打开终端,在终端切换到 ~/.cocoapods/repos 目录下,然后进行pod repo add repoName http://******* 操作 (repoName为索引库名称,自定义即可,我这里就是YMSpecRepo,后面的链接为刚创建的远程索引库地址)
在终端输入:

添加本地索引库.png

这时本地的索引库已经创建好了


本地索引库.png

3. 创建pod私有库的所需的项目工程文件

cd 到一个你需要创建项目的目录下,执行pod lib create YMCommonViewLib
这里应该会提示让你设置几个问题,简单设置下即可

创建pod私有库

显示成功之后应该会自动打开创建好的项目。
打开下图目录,可删除自动生成的ReplaceMe文件,然后手动拖入项目文件
添加项目文件.png

接下来cd 到Example目录下,执行pod install,如果跳过这一步,会出现很多问题。
image.png

然后就是对podspec文件进行配置,如下图
podspec文件

配置podspec文件

配置podspec文件

主要有name,version,homepage,license,author,source,deployment_target, source_files,依赖库等

注意:homepage和source要设置成创建好的私有库的远程仓库地址,并非索引库的仓库地址

修改完成后,cd 到YMCommonViewLib目录下,即Example所在目录,再次执行pod install,然后验证podspec文件
pod lib lint YMCommonViewLib.podspec //进行本地验证文件有效性。


验证podspec文件

可能会有警告导致失败,说的是描述信息过短,可以在执行时添加跳过警告即可
pod lib lint YMCommonViewLib.podspec --allow-warnings


跳过警告
  • 验证及推送常用的补充命令
    --allow-warnings //Allows push even if there are lint warnings
    --use-libraries //Linter uses static libraries to install the spec
    --swift-version=VERSION T//he SWIFT_VERSION that should be used to lint the spec.
    This takes precedence over a .swift-version file.
    --skip-import-validation //Lint skips validating that the pod can be imported
    --skip-tests //Lint skips building and running tests during validation
    --silent //Show nothing
    --verbose //Show more debugging information
    --no-ansi // Show output without ANSI codes
    --help // Show help banner of specified command

接下来就要将本地的项目与远端库建立连接,使用git remote add origin 远程仓库地址 // 将本地项目与远程仓库关联


与远程库建立连接

这里推送可能会失败
可能会出现下图情况


image.png

重新输入如下命令:
git pull origin master --allow-unrelated-histories,如果有冲突,就修改下冲突再提交,修改冲突可到sourceTree中修改,较直观,之后就再次提交。

这里先git add . 添加文件跟踪,然后git commit -am "提交" 提交本地暂存,然后再推送远端git push,可能会出现
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin master

那就根据提示git push --set-upstream origin master


推送远端

推送到远端之后我们还要打tag,具体如下图,不过推荐使用sourceTree,两种方式择其一


挖来的命令行

SourceTree

接着执行 pod spec lint YMCommonViewLib.podspec //命令进行本地和远程验证文件有效性。
注意:
如果私有库中依赖私有库,则验证podspec文件的时候需要加上–sources参数,否则会出现找不到你依赖的私有库。
如果上面打tag关键一步没有做,这里会出现以下问题。


image.png

4.向私有的Repo索引远程仓库中提交podspec

注意还是在刚才私有库组件的目录下,使用 pod repo push YMSpecRepo YMCommonViewLib.podspec 命令把私有库添加到私有repo索引中


向索引远程仓提交podspec

这时候repo里已经有我们刚才创建的私有库了,前往文件夹 ~/.cocoapods/repos查看,0.1.0就是我们刚才打的tag


image.png

这时候使用pod search YMCommonViewLib 已经可以搜索到
私有库搜索

5. pod私有库使用

打开项目的podfile文件
引入 pod 'YMCommonViewLib',并且在podfile最上面要指定source(索引库地址),否则会报找不到的错误,执行pod install之后,在pod文件夹下就可以看到我们自己的私有库了

注意source为索引库的地址,而不是私有库地址,索引库里面已经有了私有库的podspec了。
pod私有库使用

6. pod私有库的更新

如果私有库有文件更新,那么就必须要修改podspec文件中的version,同时tag也还是要和version保持一致,然后按之前的方法推送到私有库远端和索引库,否则将会失败。

7. pod私有库包含.a或.framework静态库的处理

如果依赖有静态库,需要像以下方式添加依赖

  s.vendored_libraries  = 'YMCommonViewLib/Classes/Lib/*.{a}'    //该目录下的.a静态库
  s.vendored_framework  = 'YMCommonViewLib/Classes/Framework/***.framework'  //Framework目录下的***.framework静态库
  s.static_framework = true  //指定pod加静态库标签

包含静态库在做验证和推送到索引库时时也要添加拼接一些命令

pod repo push YMSpecRepo YMCommonViewLib.podspec --allow-warnings --skip-import-validation --use-libraries --verbose

如果依赖的第三方有自己的私有库,在校验的时候需要指定source,后面要添加你索引库的地址

pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://******/ymspecrepo.git --allow-warnings --verbose --skip-import-validation

8. 私有库的子模块

如果你想引用一个私有库里面的一小部分功能,但是又不想把整个库导入,那么私有库的子模块正和你意
这里举例定义一个宏定义的子模块,里面是一些宏定义文件,外部可单独依赖这个子模块

  #子模块的定义,也还是在.podspec文件中
  #子模块 —— 宏定义
  s.subspec 'Macro' do |submacro|
      submacro.source_files = 'YMCommonViewLib/Classes/Macro/*.{h,m}'
  end
  #使用子模块时只需在podfile中添加  pod 'YMCommonViewLib/Macro' 即可

8. 使用私有库组件开发技巧

在实际项目开发过程中,因为有些私有库在推送到索引库时时间可能会有10-20分钟,频繁的提交到索引库并不现实,而且不适合做私有库版本控制,所以这边建议主工程可依赖私有库的分支,而不是索引库对应的tag版本,到最后项目上线或者私有库需要定个版本的时候再打tag提交到索引库。

//主工程podfile
  pod 'YMCommonViewLib',:git => 'http://****/ymcommonviewlib.git', :branch => 'branchName' #直接使用远程厂库的branchName最新提交,而不是通过ymspecrepo索引库中的tag标签
  //还有一种方式,直接使用本地的仓库
#  pod 'YMCommonViewLib',:path => '/Users/max/Project/YMCommonViewLib' #直接使用本地厂库, '/Users/max/Project/YMCommonViewLib' 是私有库在本地的目录,这种更方便于开发,在当前主工程项目里即可编译运行看到修改的效果。

如果想在私有库中添加像在PCH中导入的头文件,直接在Support Files下的prefix.pch中导入头文件,一旦在私有库工程中执行pod install操作,就会被重置,所以需要在.podspec文件中进行配置

   s.prefix_header_contents = '#import <Masonry/Masonry.h>','#import "YYCategories.h"'

推荐阅读更多精彩内容

  • 最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...
    拂晓的云阅读 4,864评论 8 19
  • 首先,也许有人觉得,开发使用远程私有库很麻烦,还不如直接写好,拖到项目中直接使用来的方便。可我想说的是,在一个小的...
    悠闲自在的蜗牛阅读 961评论 0 7
  • 随着公司业务的不断发展,应用的代码体积将会越来越大,业务代码耦合也越来越多,代码量也是急剧增加 如果仅仅完成代码拆...
    TitanCoder阅读 2,869评论 0 9
  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 9,671评论 1 31
  • 偷偷, 爱住进了心, 心把自己撕碎, 盖起一间小屋, 风和雨敲打房门, 心却在笑, 笑爱嫩绿的芽和娇艳的花。 悄悄...
    发霉的木头阅读 40评论 1 2