💖由来:你有自己的SDK可供人下载使用,通过Github,你虽然可以实现Github上的上传与管理(可见文章:[用github上传并管理自己的项目]),然而现在你想将该SDK上传给cocoapods以供别人pod导入,更新和使用.
<一>准备工作:
确保你的客户端安装有Github桌面版并登录,在网页登录上你的Github账号. 并准备好你需要上传的SDK文件内容.打开终端以备开始.
<二>详细过程:
1.0 SDK的创建目的,就是满足别人的需求,以帮助他人或者自己在开发项目时可以通过有效的第三方来更好更快的完善,开发项目.所以,在完成核心代码的编写后,按照比较的合理的操作方式,你有必要写一份用来展示自己SDK核心,主要作用的Demo,以帮助他人更好的认识,学习它.所以,如果此时你已经完成了这个步骤,那么,此时的Demo文件的框架结构应该是下图所示的:
创建Demo2.0 可以暂时把文件放起,进入真正的创建Github代码仓库并关联Cocoapods的阶段.其初期的过程更是对[用github上传并管理自己的项目]的重复.进入Github个人主页,点击Repositories然后点击New进入仓库创建界面:
进入仓库编辑界面3.0 根据下图详细提示,对仓库进行编写,在这里注意一点->※为了方便,也是规范整体结构,你要保证这里的 Repository name 要和后面的 .podspec 文件里的文件名,还有你的核心文件的文件名相一致:
编辑仓库4.0 仓库创建成功的初始模样就如下图所示,然后点击右上方 Clone or download 下的Open in Desktop 将整个仓库下载到Github桌面版并打开:
初始状态5.0 下图所示下载到桌面并打开后的大体模样,直到目前为止,你已经有了两个文件,1️⃣你之前所放起的Demo文件;2️⃣你新创建并下载,而且将会是最终提交的文件YourSDK.接下来,你就需要将两个文件合并,实际上就是需要将Demo文件的主题部分手动拖动到新的 YourSDK 文件中就可以:
下载到桌面并打开6.0 具体合并过程可见下图,在这里有个要点需要作出特别说明->在原Demo文件中,核心文件夹名为 YourSDKFiles ,在拖动到YourSDK文件夹时,我将其更改为同名文件 YourSDK ,那么问题来了,在Demo里面的 YourSDKFiles 还是存在的,但是里面的东西却不能显示了,所以在这里,需要重新打开Demo文件,并重新导入一遍核心文件 YourSDK .
合二为一7.0 一切准备妥当,接下来,就需要将新的 YourSDK 上传并异步更新到Github上去,在未提交界面,请注意一点->必须写入 Summary 或者 Description 两者中的任意一项,点击 commit 完成后,在点击 Sync 异步更新:
提交并更新8.0 提交完成后,回到网页界面并刷新,获取到最新的仓库模样,即如下图所示:
刷新页面9.0 其实,以上几个步骤就是我在上一节所说的用 Github 上传并管理自己项目的步骤,那么,接下来的步骤就是真正让你的仓库与Cocoapods关联的关键所在.
首先,将一点核心的文件,那就是一个叫 .podspec 的文件,通过下图的比对,一个仓库能不能实现与Cocoapods的关联,关键之处就在于一个属于该仓库的 .podspec 文件;
所以,接下来的所有操作基本就是围绕 .podspec 文件来进行的了:
发现核心10.0 先来自己辨识下这个文件,直接点击打开别人已经完成的 .podspec 文件(我点开的是MJ大神MJRefresh框架里podspec文件),看一下里面的秘密.
注意->1️⃣直接看里面的内容即可,第一行中的东西每个podspec文件并无差异, 往下看, s.name ,这个就是上面我所说的要与 Repository name 保持一致的SDK名.
注意->2️⃣在接下来的操作中,我将会直接拷贝别人的podspec文件,并根据自己的内容进行合理修改.但是,通过终端,你也可以通过指令进行创建:
pod spec create YourSDK.podspec
并用一下指令对其进行修改等操作,之后将会提到:
认识pod specvi YourSDK.podspec
11.0 保持podspec与整体文件和核心文件的命名一致, 在终端中 cd 该文件,找到后 进行如下操作,进入到podspec文件里:
创建podspecvi YourSDK.podspec
12.0 进入到主podspec界面后,如下图,点击键盘上的 i (insert) 就可以开始对其进行删除或者输入的操作.命名,版本号,摘要,描述,网页地址,证书,平台,作者信息,源地址,资源文件,arc的选择等等.依次根据实际情况依次修改填写.
注意->如果在终端创建,会有更多的可供选项,内容更多,很多东西对我们正在希望得到的作用并无太多帮助,尽量将其简化即可.
在修改完成并确认无误后,点击 Esc 键,然后输入 :w 保存, :q 退出:
编辑podspec13.0 在完成保存并退出后,首先要做的就是打标签,将 tag push 到Github上.通过以下四步即可:
打上标签git tag '0.0.1'
git add *
git commit -m 'add tag'
git push origin 0.0.1
14.0 接下来,在创建完善podspec并给Github打完标签后,就可以把该仓库作为分支推送给Cocoapods.
有以下操作->1️⃣对打上的标签与podspec标记的标签进行比验证,通过以下指令进行:
pod lib lint
如果成功,会返回一句如下结构的信息:
-> YourSDK (0.0.1)
2️⃣执行下图中 pod trunk push 命令,真正执行分支的推送操作.当显示 has been pushed 时,即证明推送成功.
3️⃣返回到网页界面,刷新该仓库.点击 Brand:master ,再找到 Tags 并点击,就会发现你所打的标签号.
推送分支15.0 返回到终端,在终端里执行如下指令
pod search YourSDK
如下图,即证明,此时你已经成功关联你的SDK到Cocoapods.
搜索可见<三>常见错误:
在这个操作中,其实有一些坑的,而且,这些坑都比较集中的出现在执行 pod trunk push 也就是推送分支的过程中.接下来,我将我所遇到的一些常见坑给大家填一下,有不周之处,望各位指正.
1.0 错误1️⃣:核心文件没有正确匹配
- ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.
解决1️⃣:手动导入
手动导入文件2.0 错误2️⃣:由于警告,未通过认证
YourSDK did not pass validation ,due to 1 wanrings (but you can use --allow-warnings to ignore them)
解决2️⃣:重新执行下面指令
pod trunk push YourSDK.podspec --allow-warnings
<四>补充:
整个过程其实还是比较容易理解的,就是将Github上的东西拿一份给Cocoapods托管,重点和难点就是在建立连接的部分.不过,这个过程的顺利进行,需要你对Github上的文件结构有充分的认识,还需要较为熟练的使用Github桌面版(Github Desktop).
同时,还有一点必须说明,这个过程在Cocoapods亦或者Github,还有终端的操作上,所用到的东西其实十分有限的,需要平时的积累,观察与总结.
如果能十分有谱的使用某一管理工具对自己的工作成果或者学习成果,进行有效的管理,引导的话,这对你之后的工作和学习都是大有裨益的,很多操作中将会起到事半功倍的效果.
诸君共勉!
网友评论
➜ LFBubbleView git:(master) ✗ pod lib lint
-> LFBubbleView (1.0)
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
- NOTE | [iOS] xcodebuild: xcodebuild: error: 'App.xcworkspace' does not exist.
[!] LFBubbleView did not pass validation, due to 1 error.
You can use the `--no-clean` option to inspect any issue.
➜ LFBubbleView git:(master) ✗ pod lib lint --no-clean
-> LFBubbleView (1.0)
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
- NOTE | [iOS] xcodebuild: xcodebuild: error: 'App.xcworkspace' does not exist.
Pods workspace available at `/var/folders/wt/krmcg58n3yd9ghpqp2kkndqc0000gn/T/CocoaPods/Lint/App.xcworkspace` for inspection.
[!] LFBubbleView did not pass validation, due to 1 error.