发布开源项目到cocoapods上去

发布开源项目到cocoapods上,可以让别人直接用cocoapods引用你的项目。
首先你需要安装cocoapods,如果你在安装出现了问题,请参考我的这篇帖子:
解决安装cocoapods一直卡在Setting up master repos

发布项目到cocoapods需要如下2个文件:

LICENSEpodspec,即开源许可和规格说明文件,如下图:

LICENSE

一般采用MIT格式LICENSE如下:

The MIT License (MIT)
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.



直接去这个网址MIT拷贝下来直接修改年份作者即可,也可以拿Github上别人的LICENSE,用文本编辑器打开来修改开源许可。

podspec

项目的规格说明,如下面这个podspec:
<pre>Pod::Spec.new do |s|
s.name = "FGGDownloader"
s.version = "1.0"
s.ios.deployment_target = '6.0'
s.summary = "FGGDownloader is used for resume from break point downloading."
s.homepage = "https://github.com/Insfgg99x/FGGDownloader"
s.license = "MIT"
s.authors = { "CGPointZero" => "newbox0512@yahoo.com" }
s.source = { :git => "https://github.com/Insfgg99x/FGGDownloader.git", :tag => "1.0" }
s.frameworks = 'Foundation','UIKit'
s.source_files = 'FGGDownloader/*.{h,m}'
s.requires_arc = true
#s.dependency 'SDWebImage'
#s.dependency 'pop'
end</pre>

每一项都有自己的含义:

<pre>
s.name:名称,<b>pod search name</b> 的 name
s.version:版本号
s.ios.deployment_target:支持的pod最低版本
s.summary: 简介
s.homepage:项目的地址
s.license:开源许可
s.author:作者信息,表示格式为 { "[作者名]" => "[邮箱]" }
s.source:项目的git代码仓库的地址,如格式为:{:git => "[git代码仓库地址]", tag => "[版本号]"}
s.frameworks:表示需要的框架,如'Foundation',多个框架之间以英文逗号分隔。
s.source_files:别人通过你的pod引用文件的层级目录。如我要引用FGGDownloader文件夹下的.h和.m文件,则可以写成'FGGDownloader/*.{h,m}'



s.requires_arc: 是否支持ARC
s.dependency:依赖的项目,如有多个,则写多行
#表示注释
</pre>

如何生成podspec

两种方法:
1.拷贝别人项目的podspec文件,修改作者,简介,依赖等说明信息。
2.用中端cd到项目目录,输入touch xxx.podspec生成podspec文件,其中xxx代表你项目的名字,跟上面的s.name要一致。

验证podspec文的有效性:

验证podspec的有效性,检查修复语法或者逻辑错误:

pod spec lint xxx.podspec --verbose

xxx代表你的项目名字,要与上面的s.name一致。
需要注意的是:这种验证方式,存在警告也会验证不通过。
我们用可以忽略警告的验证方式(--allow-warnings),如:

pod spec lint FGGDownloader.podspec --allow-warnings

验证车成功后会提示xxx.podspec passed validation.,如:

为你的项目添加版本号

开源许可LICENSE和podspec都做好之后,将项目push到你的远程代码仓库。

git  add .
git commit -m"添加开源许可和podspec" 
git push origin master

发布开源项目到cocoapods上去需要添加版本号,用git tag添加版本号。
git tag -a 1.0.1 -m"version 1.0.1"
添加完版本号后,用'git tag'命令查看tag是否添加成功。

git tag

将本地添加的tag同步到远程代码仓库:

git push --tag

如果你对git tag的操作存在问题,请参考我的这篇文章:彩色的git lg

万事具备

上面的准备工作都做好了,可以向cocoapods提交了。
我们可以通过pod trunk命令提交我们的开源项目到cocoapods
但是,前提是,你得注册了trunk账号,用pod trunk me验证你是否注册了:

若不是出现类似如下信息的,都是没注册的:

注册trunk账号

使用pod trunk register注册账号:

pod trunk register xxx.@xxx.xx "作者名" --verbose

上面的xxx.@xxx.xx表示邮箱,如123@yahoo.com.
--verbose选项表示输出可见性.

这个命令输入之后,你的邮箱会收到一封CocoPods发来的激活邮件,点击那个链接激活就完成注册了。

注册好了之后,用pod trunk me验证注册信息.值得注意的是,这一步如果报错:

[!] Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.

十有八九是你没有验证CocoPods给你发的邮件,此时只需要点击邮件的激活链接,就好了。

发布代码到cocoapods

该有的都准备好了,发布吧!

pod trunk push xxx.podspec --verbose

上面的xxx表示项目名,要和s.name保持一致.
需要注意的是,这种提交命令,不允许你的podspec文件存在警告。若存在警告,则不能通过有效性验证,导致发布失败!

我们可以加上允许警告的选项(--allow-warnings)如:

pod trunk push FGGDownloader.podspec --allow-warnings

若发布成功,会更新master repo,会出现有类似如下信息:


现在发布成功的界面变得好可爱啊,命令行里也能玩花样😄


验证是否发布成功:
pod search xxx

若出现红色报错:

[!] Unable to find a pod with name, author, summary, or description matching `FGHeaderView`

可以通过重新创建索引来解决:

rm ~/Library/Caches/CocoaPods/search_index.json

再次搜索时,会自动重新创建索引。
xxx表示你的项目名,要和上面的s.name 保持一致。若能查找到,表示发布成功。

若要想在别人的电脑上也能search到你的项目,则在别人电脑上更新master repos,强制更新。

pod setup

你也可以在cocoapods官网搜索你的项目来验证,但一般官网存在延迟,发布后不能立即搜出来,可能要等到第二天。

在cocoapods官网搜索验证

最后,附上我在一次pod trunk中遇到的错误,或许你能用到。错误提示:

- ERROR | [iOS] unknown: Encountered an unknown error (/Applications/Xcode.app/Contents/Developer/usr/bin/xcrun simctl list devices

这个错误是因为依赖库(s.dependency)包含了.a静态库造成的。虽然这并不影响Pod的使用,但是验证是无法通过的。可以通过--use-libraries来让验证通过。解决方法:

pod spec lint xxx.podspec --verbose --use-libraries

在push的时候使用:

pod trunk push  xxx.podspec --allow-warnings --use-libraries

感谢[quankevin]提供了这个问题的解决方法.

推荐阅读更多精彩内容