发布一个支持CocoaPods的github库
制作一个github项目库
新建github代码仓库
- 登录github,点击右上角+号,接着点击创建代码仓库,如下图:
- 填写仓库名称、描述,选择公私有、README初始化,添加忽略文件、license文件。如下图:
说明:
- 忽略文件是用来说明此仓库那些文件是不需要管理的,通常是忽略一些中间文件、临时文件。
- license文件,CocoaPods强制要求所有的Pods依赖库都必须有license文件,否则验证不会通过。license的类型有很多种,详情可以参考网址。在创建github仓库的时候,可以选择MIT类型的license。
代码实现并实时更新到github仓库
- 通过命令git clone <仓库地址>, clone github上的仓库到本地
git clone https://github.com/jiuchabaikaishui/QSPNetworking.git
- 实现代码,使用git push命令推送到github仓库
- 创建标签并上传github仓库,命令及操作如下:
git tag:查看tag
git tag <标签名>:创建标签
git tag -a <标签名> -m “信息” :根据commit id创建标签
git show <标签名>:查看标签信息
git push origin <标签名>:推送一个本地标签
git push origin –tags:推送本地全部未推送的标签
支持CocoaPods
创建podspec
- 在本地仓库根目录下使用pod spec create <工程名称>命令创建podspec文件
pod spec create QSPNetworking
- 编辑podspec文件
Pod::Spec.new do |s|
s.name = "QSPNetworking"
s.version = "1.0.0"
s.summary = "一个使得网络请求更加简单、灵活的iOS网络框架。"
s.description = <<-DESC
这是一个基于AFNetworking再次分装的网络框架,使得iOS中的网络请求更加简单、灵活。
DESC
s.homepage = "https://github.com/jiuchabaikaishui/QSPNetworking"
s.license = { :type => "MIT", :file => "LICENSE" }
# s.license = { :type => "MIT", :file => "FILE_LICENSE" }
s.author = { "jiuchabaikaishui" => "aaa@qq.com" }
s.platform = :ios
s.source = { :git => "https://github.com/jiuchabaikaishui/QSPNetworking.git", :tag => "#{s.version}" }
s.source_files = "QSPNetworking", "QSPNetworking/**/*.{h,m}"
s.requires_arc = true
s.dependency "AFNetworking", "~> 3.2.0"
end
完成上面所有操作,目前本地仓库根目录如下:
- 执行pod lib lint命令验证.podspec文件是否配置成功
在执行pod lib lint验证命令的时候,打印出了任何warning或者error信息,验证都会失败!如果验证出现异常,打印的信息会很详细,可以根据对应提示做出修改。
如果出现如下错误:
那么打开Xcode做如下设置:
如果出现如下错误:
那么添加–verbose的参数,执行命令如下:
pod lib lint --verbose
如果出现如下错误:
执行命令pod lib lint 文件名称.podspec –use-libraries –allow-warnings如下:
pod lib lint QSPNetworking.podspec --use-libraries --allow-warnings
直到如下图,验证才通过:
建议:pod lib lint这条命令后面跟着–verbose的参数(能看到具体的出错信息),除此之外,这条命令还可以跟其他参数,例如 –allow-warnings 是否允许警告,在用到第三方框架的时候,有的时候是自带会有warmings的代码,用这参数可以屏蔽警告如果一切正常。
- 验证通过后,执行上传命令pod trunk push 文件名称.podspec,上传到CocoaPods官方仓库中,如果有新的tag版本的话也是通过该命令进行上传新的版本到Cocoapods的。
pod trunk push QSPNetworking.podspec
如果出现如下错误:
那么执行注册命令pod trunk register ‘邮箱’ ‘用户名’ –description=’电脑描述’。然后会收到一封邮件,点击邮件中的链接就行。可以通过pod trunk me命令查看个人信息。
如果出现如下错误:
那是因为在验证.podspec文件的时候加上了参数,上传也同样需要加上参数,调整上传命令如下:
pod trunk push QSPNetworking.podspec --use-libraries --allow-warnings
知道如下图所示,才说明上传成功了!
搜索自己的库
- 执行pod search QSPNetworking,忽然发现提示如下:
[!] Unable to find a pod with name, author, summary, or description matching QSPNetworking
不要慌,执行命令rm ~/Library/Caches/CocoaPods/search_index.json,在执行pod search QSPNetworking命令,发现真的可以搜到了。
附录
podspec文件属性说明
- 必要属性
//项目名
s.name ='HycProject'
//版本号
s.version ='1.0.1'
//license文件的类型
s.license = 'MIT'
//简单描述
s.summary = 'ATest in iOS.'
//项目的getub地址,只支持HTTP和HTTPS地址,不支持ssh的地址
s.homepage ='https://github.com/hyc603671932/HycProject'
//作者和邮箱
s.authors = {'HouKavin' => 'aaa@qq.com' }
//git仓库的https地址
s.source = { :git=> 'https://github.com/hyc603671932/HycProject.git', :tag =>s.version}
//是否要求arc(有部分非arc文件情况未考证)
s.requires_arc = true
//在这个属性中声明过的.h文件能够使用<>方法联想调用(这个是可选属性)
s.public_header_files = 'UIKit/*.h'
//表示源文件的路径,这个路径是相对podspec文件而言的。(这属性下面单独讨论)
s.source_files ='AppInfo/*.*'
//需要用到的frameworks,不需要加.frameworks后缀。(这个没有用到也可以不填)
s.frameworks ='Foundation', 'CoreGraphics', 'UIKit'
- 可选属性
//详细介绍
s.description = "详细介绍"
//支持的平台及版本
s.platform = :ios, '7.0'
//最低要求的系统版本
s.ios.deployment_target= '7.0'
//主页,需填写可访问地址
s.homepage = "https://coding.net/u/wtlucky/p/podTestLibrary"
//截图
s.screenshots = "www.example.com/screenshots_1"
//多媒体介绍地址
s.social_media_url = 'https://twitter.com/<twitter_username>'
//效果和s.public_header_files的相同,只需要配置一种
s.ios.public_header_files = 'URS/URSAuth.h'
//不常用,所有文件默认即为private只能用import"XXX"调用
s.ios.private_header_files
#依赖关系,该项目所依赖的其他库
s.dependency 'AFNetworking', '~> 2.3'
//可拥有多个dependency依赖属性
s.dependency 'JSONKit', '~> 1.4'
//动态库所使用的资源文件存放位置,放在Resources文件夹中
s.resource_bundles = {
'Test5' => ['Test5/Assets/*.png']
}
//资源文件(具体使用带考证)
s.resources = 'src/SinaWeibo/SinaWeibo.bundle/**/*.png'
//建立名称为Info的子文件夹(虚拟路径)
s.subspec 'Info' do |ss|
//应该和s.subspec作用相同(未考证)
s.default_subspec
- source_files属性
//下载AppInfo文件夹下的所有文件,子文件夹不识别
s.source_files ='AppInfo'
//下载AppInfo目录下所有格式文件
s.source_files ='AppInfo/*.*'
**/*表示Classes目录及其子目录下所有文件
s.source_files = 'AppInfo/**/*'
//下载HycProject文件夹下名称为AppManInfo和AppWomanInfo的共4项文件
s.source_files ='HycProject/App{Man,Woman}Info.{h,m}'
//目标路径下的文件不进行下载
s.ios.exclude_files = 'AppInfo/Info/json'