简述
平常开发都是通过CocoaPods集成别人的开源库,这次要做一个自己的开源库,虽然是仿照别人的开源库写,但是重点是发布到CocoaPods的流程。发布过程中并不顺利,所以留个记录,便于以后查找,也便于有缘人参考。
成功发布自己的开源库主要分为4个部分,从创建项目开始,然后是上传到GitHub,第三步是配置,第四步发布。最后是验证自己发布的开源库是不是可以搜到,可以集成到项目中。
下面进入主题
创建项目
一般来说,我们集成开源库时,没有带demo的,都是有用的代码文件,但是作为开源库作者,肯定要有一个对应的demo才方便开发-验证-上传-迭代。所以需要创建一个带有demo和开源库的项目,下面开始创建
创建一个名字为ZHPageView的framework项目
记得勾上git,创建对应的本地仓库
创建完成后,因为是framework而并非App项目,所以肯定是跑不起来的,所以需要建一个与这个framework项目关联的App项目,创建方式如下:
接下来就是跟你平时创建项目一样,创建完成后我的目录是这样的
那整个结构的初始部分创建完毕,分别编译两个项目,正常来说都会编译成功。
接下来就是编写开源库及demo的代码
此处省略1024...
如果整个项目开发完成,就可以进入下一个步骤。
我开发完成以后是这样的层级目录结构:
其中ZHPageView文件夹下的三个.swift文件是加进去的,info.plist和ZHPageView.h是创建项目时自带的。
开源库对外的文件就是ZHPageView文件夹下的这三个.swift文件,后面配置中会有说到。
跑起来的效果如下
创建项目完成
上传到GitHUb
要上传先得有远程仓库,在GitHub上创建一个对应的远程仓库
注意红色框的地方,别选错就行,创建成功后得到一个仓库地址。接下来就是将本地仓库跟远程仓库关联上,直接展示命令如下:
// 首先提交代码
git add .
git commit -m "run demo"
// 本地仓库关联远程仓库
git remote add origin https://github.com/xiangzuhua0209/ZHPageView.git
// 将远程仓库的文件全部拉下来到本地
git pull --rebase origin main
// 将本地已经提交的文件全部push到远程仓库
git push --set-upstream origin main
// 查看是否都提交了
git status
// 如果还有改变未提交,再进行一次提交并push到远程
git add .
git commit -m "changes"
git push // 可以看到已经能push到远程仓库了
到这一步,本地仓库和远程仓库成功关联
配置
打tag
必须要有,跟版本控制有关,
git tag 1.0.0
push到远程仓库
git push --tags
创建.podspec文件
这个地方最关键,创建位置在与README.md和LICENSE同级的目录下,命令如下:
pod spec create ZHPageView
会得到一个名字为ZHPageView.podspec的文件,如图:
然后开始编辑里面的内容,建议进到文件夹用文件编辑器打开这个文件,在终端打开编辑比较慢,最后格式应该是这样的:
Pod::Spec.new do |s|
s.name = 'ZHPageView'
s.version = '1.0.0'
s.swift_version = '5.0'
s.summary = 'Simple Tabs'
s.description = <<-DESC
News Categories, Slide toggle, Tabs, Title Options,ViewControllers
DESC
s.homepage = 'https://github.com/xiangzuhua0209/ZHPageView'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xiangzuhua' => 'xiangzhuhua0209@126.com' }
s.ios.deployment_target = "13.0"
s.source = { :git => 'https://github.com/xiangzuhua0209/ZHPageView.git', :tag => s.version }
s.source_files = 'ZHPageView/*.swift'
s.requires_arc = true
end
就是配置基本信息,一般能看懂大概意思。就说两个地方,
- s.ios.deployment_target要跟framework的iOS版本对应,如下:
- s.source_files 对应的是公开的文件,'ZHPageView/*.swift'匹配的是ZHPageView文件夹下以.swift为后缀的文件。
编辑完成后进行校验,看语法是否正确,同样是在该文件目录下,执行命令:
pod spec lint ZHPageView.podspec --verbose
要等待几分钟,如果最后是下面这样的结果,说明配置没问题:
** BUILD SUCCEEDED **
Testing with `xcodebuild`.
-> ZHPageView (1.0.0)
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Building targets in parallel
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | [iOS] xcodebuild: note: Planning build
- NOTE | [iOS] xcodebuild: note: Constructing build description
- NOTE | [iOS] xcodebuild: warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')
Analyzed 1 podspec.
ZHPageView.podspec passed validation.
不过一般都没那么顺利,除了语法问题,还有一个网络问题经常导致校验失败,像下面这样是再正常不过了:
我的应对方法是,不停的重新校验,或者切换网络重新校验,一般来说,最后会成功的
万事俱备,只差发布了
发布
发布的命令如下:
pod trunk push ZHPageView.podspec
在.podspec文件目录下执行就可以,等待发布结果,
➜ ZHPageView git:(main) ✗ pod trunk push ZHPageView.podspec
Updating spec repo `trunk`
Validating podspec
-> ZHPageView (1.0.0)
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Building targets in parallel
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | [iOS] xcodebuild: note: Planning build
- NOTE | [iOS] xcodebuild: note: Constructing build description
- NOTE | [iOS] xcodebuild: warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')
Updating spec repo `trunk`
--------------------------------------------------------------------------------
🎉 Congrats
🚀 ZHPageView (1.0.0) successfully published
📅 May 27th, 20:29
🌎 https://cocoapods.org/pods/ZHPageView
👍 Tell your friends!
--------------------------------------------------------------------------------
像这样显示的话说明发布成功,既然发布成功,那应该可以搜到
搜寻
搜索的命令很简单了
pod search ZHPageView
搜索结果如下:
-> ZHPageView (1.0.0)
ZHPageView is a Slide tabs pure-Swift library
pod 'ZHPageView', '~> 1.0.0'
- Homepage: https://github.com/xiangzuhua0209/ZHPageView
- Source: https://github.com/xiangzuhua0209/ZHPageView.git
- Versions: 1.0.0 [master repo]
-> EMPageViewController (4.0.0)
A better page view controller for iOS.
pod 'EMPageViewController', '~> 4.0.0'
- Homepage: https://github.com/emalyak/EMPageViewController
- Source: https://github.com/emalyak/EMPageViewController.git
- Versions: 4.0.0, 3.0.0, 2.0.2, 2.0.1, 2.0.0, 2.0.0-beta.1 [master repo]
-> JHPageViewController (0.2.3)
JHPageViewController.
pod 'JHPageViewController', '~> 0.2.3'
- Homepage: https://github.com/jackiehu/
- Source: https://github.com/jackiehu/JHPageViewController.git
- Versions: 0.2.3, 0.2.2 [master repo]
-> LXPageViewWithButtonsViewController (0.1.2)
赫赫有名,能搜到应该能集成,试一试
如果搜寻不到,可以试试更新本地仓库
pod repo update // 更新本地仓库,本地仓库完成后,即可搜索到指定的第三方库
如果还搜不到,就去百度或者谷歌吧
自己集成
随便新建一个项目,创建Podfile文件,添加配置:
platform :ios,'13.0'
target 'Test' do
use_frameworks!
inhibit_all_warnings!
pod 'ZHPageView', '~> 1.0.0'
end
执行pod install
➜ Test git:(main) ✗ pod install
Analyzing dependencies
Downloading dependencies
Installing ZHPageView (1.0.0)
Generating Pods project
Integrating client project
[!] Please close any current Xcode sessions and use `Test.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
集成成功!再试下通过.xcworkspace文件打开项目,编译是否通过,通过就没问题了。我的测试项目集成后的样子是这样的:
迭代版本
如果给开源库修复了bug,或者添加新功能,那就要更新开源库的版本,操作方式和上面的类似,这里我就简单描述下
-
1、修复bug或更新功能
代码写完后,编译framework,然后再demo上测试通过
-
2、代码提交到GitHub的仓库中
git add .
git commit -m "fix bug"
git push
-
3、打tag
git tag 1.0.1
git push --tags
-
4、修改.podspec文件
将文件中的version对应的版本号改一下
s.version = '1.0.1'
-
5、验证podspec文件并发布
pod spec lint ZHPageView.podspec --verbose
pod trunk push ZHPageView.podspec
-
6、cocoaPods集成开源库并测试验证
删除已发布的开源库
执行命令
pod trunk delete ZHPageView 1.0.0
一般会有提示,输入y就可以,如果删除成功,会有提示
➜ ZHPageView git:(main) ✗ pod trunk delete ZHPageView 1.0.0
WARNING: It is generally considered bad behavior to remove versions of a Pod that others are depending on!
Please consider using the `deprecate` command instead.
Are you sure you want to delete this Pod version?
> y
[!] The version is already deleted.