iOS组件化(一)发布组件到CocoaPods

iOS组件化第一篇,如何将组件发布到CocoaPods。

iOS组件化(一)发布组件到CocoaPods

最近做项目xxxxx....
以上省略1000字,项目必需要搞组件化!!!

1.安装CocoaPods

组件使用必然需要用到CocoaPods,并且使用CocoaPoPds来管理你的组件,既然要发布到CocoaPods,先安装CocoaPods是第一步,这个网上的教程很多,就不详细说了。

2.创建远程仓库

在github上面Create a new repository
1-1

  • Repository name 即为组件名字

  • Description 可以随便写一些

  • Public和Private根据自己的需要选择

  • README文件不用勾选,使用默认的模板即可

  • 创建完成得到

2

远程仓库索引
https://github.com/MethodName/TShareView.git

3.创建本地组件代码库

  • 命令
pod lib create <组件名>
  • 示例
pod lib create TShareView
  • 执行结果

What platform do you want to use?? [ iOS / macOS ]  选择平台

What language do you want to use?? [ Swift / ObjC ] 选择语言

Would you like to include a demo application with your library? [ Yes / No ] 是否自动生成一个用来做demo测试的模板库

Which testing frameworks will you use? [ Specta / Kiwi / None ] 是否集成测试框架

Would you like to do view based testing? [ Yes / No ] 是否做基于View的测试

What is your class prefix? --类文件前缀

  • 示例(根据自己的实际需要选择即可)

What platform do you want to use?? [ iOS / macOS ]
 > iOS

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?
 > TMM

  • 完成之后将得到一个工程,目录结构如下

3

4.为组件工程添加组件

例如我将已经写好的组件文件放在工程Classes文件中,Classes文件位置如下图
4

添加组件文件

这两个文件就是组件的文件,ReplaceMe.m文件可以删除
A508FA8D-A3E5-4AD1-A9E6-EC45A89C3E2E

5.将添加的组件文件Pod到Example文件夹中

  • 进入TShareView>Example文件夹(有Podfile的文件夹)

  • 执行 pod install 命令

  • 执行完成后的工程目录
    组件文件出现在Pods的工程中
    5

6.修改.podspecs索引文件

打开工程中的TShareView.podspec文件
7

#
# Be sure to run `pod lib lint TShareView.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'TShareView' 1、组件名称
  s.version          = '0.1.0'  2、版本
  s.summary          = 'A short description of TShareView.' 3、组件描述

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/Methodname/TShareView' 4、更换为github的仓库地址
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' } 5、监听
  s.author           = { 'methodname@qq.com' => 'methodname@qq.com' } 6、作者
  s.source           = { :git => 'https://github.com/Methodname/TShareView.git', :tag => s.version.to_s } 7、更换为github的远程仓库索引
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0' 8、iOS支持版本

  s.source_files = 'TShareView/Classes/**/*' 9、组件文件路径
  
  # s.resource_bundles = {
  #   'TShareView' => ['TShareView/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3' 10、依赖
end

必须要更改的有:3、5、7、10处,其它项可以视情况更改。

  • 第3处不更改,后台发布会报警告
  • 第5处生成的可能是默认地址,不是你的github仓库地址
  • 第7处生成的也可能是默认索引,不是你的github远程仓库索引
  • 第10处为依赖组件,如果组件有依赖于其它组件,则需要放开此处注释,将组件引用进来,并且同时还需要在Podfile中添加依赖的组件,以保证项目能编译通过。

7.提交到远程仓库

在TShareView工程根目录执行

  • 命令
git add .

git commit -m "提交说明"

git remote add origin 远程代码仓库地址

git push origin master

git tag 版本号 (注:这里的版本号必须和podspec里写的版本号一致)

git push --tags

  • 示例
git add .

git commit -m "一个共享的组件"

git remote add origin https://github.com/MethodName/TShareView.git

git push origin master

git tag 0.1.0 (注:这里的版本号必须和podspec里写的版本号一致)

git push --tags

8.验证cocoaPods索引文件

在TShareView工程根目录执行

  • 命令
pod spec lint --verbose --allow-warnings
  • 验证成功打印
TShareView.podspec passed validation.
  • 验证失败
    可能会出现一些错误,会打印出一条红色错误消息告诉你有什么错误,这个时候不要慌,往上面翻,会有详细的错误说明;详细见文章最后的一些解决办法。

9.注册Trunk

我们可以使用trunk来发布组件,trunk需要CocoaPods 0.33版本以上
查看是否注册trunk

pod trunk me
  • 注册命令
pod trunk register 邮箱 "注册名字" --verbose
  • 示例
pod trunk register methodname@qq.com "methodname" --verbose

注册完成之后会给你的邮箱发个邮件,进入邮箱邮件里面有个链接,需要点击确认一下.

10.发布

在有.podspec文件的组件工程根目录执行

  • 命令
pod trunk push xxxx.podspec 
  • 示例
pod trunk push TShareView.podspec 

如果配置报警告的话,则需要在后面加--allow-warnings允许警告

pod trunk push TShareView.podspec --allow-warnings 

11.发布完成

Updating spec repo `master`
Validating podspec
 -> TShareView (0.1.0)

Updating spec repo `master`

--------------------------------------------------------------------------------
 🎉  Congrats

 🚀  TShareView (0.1.0) successfully published
 📅  May 30th, 04:36
 🌎  https://cocoapods.org/pods/TShareView
 👍  Tell your friends!
--------------------------------------------------------------------------------

12.使用

现在,在Podfile中加入它,就能使用你的远程组件了,赶紧去找你的小伙伴分享吧~

pod 'TShareView'

13.发布完成之后搜索不到的问题解决办法。

将组件在CocoaPods上面发布之后,使用pod search 组件名称却搜不到相关的信息,这个时候需要将cocoaPods的搜索缓存文件清理一下,然后重新使用pod search,就能得到最新的结果。

进入搜索CocoaPods缓存目录
cd ~/Library/Caches/CocoaPods

查看缓存文件search_index.json
ls

删除搜索缓存文件
rm -f search_index.json

错误解决办法

  • 找不到命令行路径
xcrun:error:unable to find utility 'simctl',not a deveoper tool or in PATH

在XCode->Preferences>Locations
将Command Line Tools 设置一下再重新执行上面的命令就行行了,原因是Command Line Tools默认是没有设置的,所以才会报以上错误。
8

  • 迭代时引用了组件库
    错误信息
xcodebuild: Returned an unsuccessful exit code.

组件有依赖,迭代组件版本的时候,需要加上--use-libraries,例如下:

pod spec lint --use-libraries
  • 允许警告
--allow-warnings

例如下:

pod spec lint --allow-warnings
  • 显示详情信息
--verbose

例如下:

pod spec lint --verbose