首先本人会以github为例,创建自己的私有库。不懂请看下面,让我慢慢告诉你怎么创建自己的公有库!
第一步 用本人账号在github创建一个公有仓库
MIT License 是稍后podspec里面要用到的协议
第二步 Cocoapods注册Trunk
$pod trunk register [Your-Email] '[Your-Name]' --description='[Your-Desc]'
> [Your-Email]: 任意邮件,但是我比较推荐你使用github上的Email
> [Your-Name]: 推荐使用github上使用的Name
> [Your-Desc]: 一个简单的描述,往往这个时候我们使用的是自己电脑的一个描述
// 比如我自己注册了一个$ pod trunk register 1136200379@qq.com 'PCZheng' --description='iMac (Retina 4K, 21.5-inch, 2017)'// 注册完成后,你可以通过[pod trunk me]查看信息
$ pod trunk me 查看信息是会有[!] Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.这是要在你注册的[Your-Email]查看给你发的email点击里面的链接认证。由于我没有认证所以,pod trunk me 并能查看信息,需要叫我认证,由于最先没反应过来,我又注册了trunk一次,注册错了可以删除,删除具体的方法执行pod trunk --help,查看删除方法。
第三步、将你第一步创建的库,clone到指定的文件夹里面
第四步、创建.podspec文件 并且编辑.podspec
该步骤是重点也是难点,该步骤要是出什么错误了,后面都是扯淡,本人就因为各种各样的问题在这个步骤卡了很久,最后通过各种解决方案解决了,有些坑只有自己趟过了才知道难不难,所以废话也不多说,遇到各种不会的就goole和百度吧,或者@我也行。
.podspec 即pod描述文件podspec specification
为了讲明白这一步,这一步主要分为下面这几个步骤:
1.如何创建podspec文件
2.如何编写podspec文件
3.如何实现目录分层
4.如何校验podspec文件
5.在校验podspec文件所遇到过的问题
1.如何创建podspec文件
$pod spec create 库名
例如我自己的PageController
该目录下就会多一个PageController.podspec文件,可以有文本编辑打开对这个文件进行编辑
Pod::Spec.new do |s|
s.name = "PageController" #框架名
s.version = "0.0.1" #当前版本号,在pod search PageController的时候会显示该信息
s.summary = "A short description of PageController."#详细描述,在pod search PageController的时候会显示介绍
s.description = <<-DESC
DESC
s.homepage = "http://EXAMPLE/PageController"#页面链接
# s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"
s.license = "MIT (example)"#开源协议,也就是第一步选择的协议
# s.license = { :type => "MIT", :file => "FILE_LICENSE" }
s.author = { "RainbowWait" => "1136200379@qq.com" }#作者
# Or just: s.author = "RainbowWait"
# s.authors = { "RainbowWait" => "1136200379@qq.com" }
# s.social_media_url = "http://twitter.com/RainbowWait"
#s.platform = :ios
s.platform = :ios, "8.0"#支持iOS平台最低版本
# When using multiple platforms
# s.ios.deployment_target = "5.0"
# s.osx.deployment_target = "10.7"
# s.watchos.deployment_target = "2.0"
# s.tvos.deployment_target = "9.0"
s.source = { :git => "http://EXAMPLE/PageController.git", :tag => "#{s.version}" }#源码git地址 以及tag标签
s.source_files = "Classes", "Classes/**/*.{h,m}"#源文件(可以包含.h和.m)
s.exclude_files = "Classes/Exclude"
# s.public_header_files = "Classes/**/*.h"#头文件(.h文件)
# s.resource = "icon.png"
# s.resources = "Resources/*.png"#资源文件(配置的文件都会放到mainBundle中)
# s.preserve_paths = "FilesToSave", "MoreFilesToSave"
# s.framework = "SomeFramework"
# s.frameworks = "SomeFramework", "AnotherFramework"#依赖的系统的框架
# s.library = "iconv"
# s.libraries = "iconv", "xml2"#依赖的系统库
s.requires_arc = true#支持ARC
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# s.dependency "JSONKit", "~> 1.4"#依赖的第三方库
https://guides.cocoapods.org/syntax/podspec.html 请参照Podfile详细
上面列举的信息大部分来自pod默认生成的podspec文件中的给的,其中需要重点注意标识黑体的这几个信息
下面我会举例说明giant如何写podspec中的每项配置。
s.source 源代码地址 以及tag 标签
s.source = { :git => "https://github.com/RainbowWait/PageController.git", :tag => "0.0.1" }
git tag 0.0.1 设置的tag标签为0.0.1 git tag -d 0.0.1删除0.0.1的tag标签 最后提交的时候git push --tags
s.source_files 配置三方库的源文件(.h或.m文件),swift是配置.swift文件
写法:
OC:s.source_files = "Classes/**/*.{h,m}"#Classes路径下的所有匹配文件
s.source_files = "Classes/*.{h,m}"#Classes文件夹下的所有匹配文件
s.source_files = “Classes/PageController.{h,m}"#直接指定文件名
Swift:s.source_files = "Classes/**/*.{swift}"#Classes路径下的所有匹配文件
s.source_files = "Classes/*.{swift}"#Classes文件夹下的所有匹配文件
s.source_files = “Classes/PageController.{swift}"#直接指定文件名
public_header_files头文件
s.public_header_files = "Classes/**/*.h"#Classes路径下所匹配的.h文件
s.public_header_files = "Classes/*.h"
s.public_header_files = "Classes/Public.h"
vendored_frameworks 引用非系统的框架
s.ios.vendored_frameworks = "Frameworks/MyFramework.framework"
s.vendored_frameworks = 'MyFramework.framework’,'TheirFramework.framework'
frameworks配置系统框架
s.frameworks = 'Foundation', 'CoreGraphics', 'UIKit'
vendored_libraries 非系统静态库(要注意,这里的.a静态库名字必须要带lib前缀,如果引用的静态库名字没lib前缀会导致编译报错,只需要重命名加上即可)
s.ios.vendored_library = 'Libraries/libProj4.a'
s.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
libraries:配置依赖的系统库(要注意,这里的写法需要忽略lib前缀)
libraries = 'c++’,'sqlite3', 'stdc++.6.0.9', 'z'
resources:配置资源文件(.bundle,.png,.txt等资源文件,这些资源文件会被放到mainBundle中,要注意避免发生命名重复的问题)
s.resources = ['Images/*.png’,'Sounds/*']
s.resource = 'Resources/HockeySDK.bundle'
resource_bundles:配置指定bundle的资源文件(可以解决resources导致的命名冲突问题)
spec.ios.resource_bundle = { 'MapBox' => 'MapView/Map/Resources/*.png' }
spec.resource_bundles = {
'MapBox' => ['MapView/Map/Resources/*.png'],
'OtherResources' => ['MapView/Map/OtherResources/*.png']
}
swift_version 支持Swift的版本
s.swift_version = '4.0'
dependency:依赖的三方库,pod库或者可以是自身的subspec
3.如何实现目录分层3.如何实现目录分层
使用subspec来实现目录分层。
目录分层的好处:
目录分层,结构清晰;
使用pod引入一个三方库时,可以只引入一个subspec而不用将整个三方库引入。
例如AFNetworking:
嵌套请参考 CocoaPods Guides - Podspec Syntax Reference v1.6.0.beta.2
4.如何校验podspec文件
pod lib lint (首先从本地验证你的pod能否通过验证)
pod spec lint (从本地和远程验证你的pod能否通过验证)
pod lib lint --verbose (加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息)
pod lib lint --allow-warnings (允许警告,用来解决由于代码中存在警告导致不能通过校验的问题)
pod lib lint --help (查看所有可选参数,可选参数可以加多个)
首先把你的代码先提交到远程仓库,并且把设置的标签页推送到远程仓库,以下是截图
修改后的PageController.podspec文件
从本地和远程验证pod能否验证通过
pod spec lint --allow-warnings
第五步、搭建私有库环境
1.创建自己的私有库
pod repo add [repo名] [repo Git地址]
例如:pod repo add PageControllerRepo https://github.com/RainbowWait/PageController.git
查看私有库是否创建成功
pod repo list 下面的lists错误了是list
需要注意的是:
1. 要记得将代码提交到远端
2. 要记得打tag,每个tag对应一个三方库版本
3. podspec文件中version的值要与git中的一个tag对应
2.向私有的repo库中提交podspec
pod repo push [repo名] [.podspec文件名] 在验证的时候有警告就要加上--allow-warnings,否则会失败
3.提交公有library
pod trunk push [NAME].podspec
pod repo update// 查找一下你提交的pod
pod search PageController
文章参考了 Cocoapods整理(四)——搭建Cocoapods私有库环境 - Zcp大官人的iOS开发专栏 - SegmentFault 思否
Cocoapods整理(三)——编写podspec文件 - Zcp大官人的iOS开发专栏 - SegmentFault 思否