1 进入Github网站www.github.com登陆自己的账号后
2 建立一个新的仓库
创建新的仓库
3 填写仓库信息
填写仓库信息
4 创建完毕后
创建成功
二、上传代码到创建的仓库
1 选择clone 到本地仓库
mac 电脑中,有github的客户端
github MAC客户端
进入github网站后,右边栏
clone
也可以用命令终端的
// 代码仓库clone 地址 git clonehttps://github.com/boyXiong/XWSwiftRefreshT.git
2.编写代码
写入的代码
3.创建一个tag 版本
创建一个Tag
如果这里不会,可以看我的另一篇文章Git tag的使用
http://www.jianshu.com/p/32054f3e415d
4.上传到github
上传到github仓库
三、向本地git仓库中添加创建Pods依赖库所需文件
1 这个文件需要放在clone 到的本地仓库目录下(需要在终端cd进入clone的那个目录下)
2 创建 podspec
// 在命令终端pod spec create XWSwiftRefreshT
成功后
创建podspec成功
3 编写podspec文件,可以使用Vim,或者Xcode,Sublime也可以,这是一个Ruby文件
Pod::Spec.newdo|s|# 名称 使用的时候pod search [name]s.name ="XWSwiftRefreshT"# 代码库的版本s.version ="0.1.2"# 简介s.summary ="The easiest way to use pull-to-refresh with Swift2.0 program language."# 主页s.homepage ="https://github.com/boyXiong/XWSwiftRefreshT"# 许可证书类型,要和仓库的LICENSE 的类型一致s.license ="MIT"# 作者名称 和 邮箱s.author = {"boyXiong"=>"relv@qq.com"}# 作者主页 s.social_media_url ="http://blog.csdn.net/boyXiong.com/"# 代码库最低支持的版本s.platform = :ios,"8.0"# 代码的Clone 地址 和 tag 版本s.source = { :git =>"https://github.com/boyXiong/XWSwiftRefreshT.git", :tag =>"0.1.2"}# 如果使用pod 需要导入哪些资源s.source_files ="XWSwiftRefreshT/**/*.{swift}"s.resources ="XWSwiftRefreshT/Icon/xw_icon.bundle"# 框架是否使用的ARCs.requires_arc =trueend
4 编写完成后,先进行本地检查,使用,如何可以就是绿色,不然会报错
//pod spec lint [podspec 的路径]pod spec lint ./XWSwiftRefreshT.podspec
5 注意 这个命令的检查原理,是调用Xcode app的命令检测如果Mac上安装了两个Xcode那么他的检查是根据Application/Xcode.app/这种路径来的,两个Xcode 就要确保Xcode.app是最新的正式版本不是测试版本
6 然后可以发送到cocoapod管理了
//pod trunkpush[podspec 的路径]pod trunkpush./XWSwiftRefreshT.podspec
上传到cocoapod成功
7.到这里如果成功就搜索的到,那么就是说可以成功使用了
pod search XWSwiftRefreshT
成功搜索到框架
Paste_Image.png
这是我整理的开发常用Category 用pod 搜索 TTCategory 就可以
github连接:https://github.com/yangyangFeng/TTCategory.git
大家有新的,好用的category也可以发给我我回持续更新.
一、创建的github仓库
1 进入Github网站www.github.com登陆自己的账号后
2 建立一个新的仓库
创建新的仓库
3 填写仓库信息
填写仓库信息
4 创建完毕后
前面的步骤比较简单相信大家很容易就能clone到本地,如果没有github个客户端的可以去下一个,没有的话用命令也是可以的
接下来把你想要托管的代码放入本地仓库中
这里看到 .podspec 和TTcategory 是同一级目录,下面设置 podspec 文件,文件路径的时候要用到这里.
四、注册TRUNK
在注册trunk之前,我们需要确认当前的CocoaPods版本是否足够新。trunk需要pod在0.33及以上版本,如果你不满足要求,打开Terminal使用ruby的gem命令更新pod:
sudo geminstallcocoapods
更新结束后,我们开始注册trunk:
pod trunk register aaaaaaag@163.com'fengyangyang'--verbose输入你的邮箱,并设置你的昵称.随后会给你发送一封验证邮件.
邮箱以及用户名请对号入座。用户名我使用的是Github上的用户名。--verbose参数是为了便于输出注册过程中的调试信息。执行上面的语句
后,你的邮箱将会受到一封带有验证链接的邮件,如果没有请去垃圾箱找找,有可能被屏蔽了。点击邮件的链接就完成了trunk注册流程。使用下面的命令可以
向trunk服务器查询自己的注册信息:
pod trunk me
输出如下信息就表示你注册成功,可以进行下面的流程:
五、添加Podspec
为你的代码添加podspec描述文件;
$pod lib lint
六、配置podspec描述文件
这一步与更换trunk方式前的操作完全一样。什么是podspec描述文件呢?简单地讲就是让CocoaPods搜索引擎知道你的代码的作者、版本号、源代码地址、依赖库等信息的文件。任何支持CocoaPods的开源代码都必须有podspec文件。CocoaPods在github中用一个repo来管理所有支持CocoaPods的开源代码:https://github.com/CocoaPods/Specs。
podspec文件很简单,但是第一次做不是很容易.我推荐看一下 猫爪的 blog点击打开链接
blog里面介绍的很详细,在此也要感谢猫爪,为我解答了遇到的问题.
设置好podspec后,我们要验证一下,podspec 时候通过验证
$pod lib lint
如果一切正常,这条命令执行完后会出现下面的输出:
-> 你的库名 (1.0.0) 你的库名 passed validation.
到此,pod验证就结束了。 需要说明的是,在执行pod验证命令的时候,打印出了任何warning或者error信息,验证都会失败!如果验证出现异常,打印的信息会很详细,大家可以根据对应提示做出修改。
七、本地git仓库修改内容上传到github仓库
依次执行以下命令:
$ git add -A && gitcommit-m"Release 1.0.0."$ git tag'1.0.0'$ git push--tags$ git push originmaster
八、现在如果你的 podspec通过验证了,代码push 到github并且 打好tag,那么现在可以进行最后一步了.将podspec文件通过trunk推送给CocoaPods服务器(PS:如果这部分出错,那么你需要先对应错误修改,然后重复 5~8 过程)
$ pod trunkpush./文件名.podspec 如果接下来没有提示任何error 和警告的话,那么恭喜你!你的代码就已经上传到cocoapod上了.
正规的仓库都应该有一个license文件,Pods依赖库对这个文件的要求更严,是必须要有的。因此最好在这里让github创建一个,也可以自己后续再创建。我使用的license类型是MIT。
把项目clone到本地然后在根目录下新建MyPodDemo.podspec
或使用命令
$ pod spec create MyPodDemo
Spec文件编写:
Pod::Spec.new do |s|
s.name = "MyPodDemo"
s.version = "0.0.1"
s.summary = "A short description of MyPodDemo."
s.description = <<-DESC
A longer description of MyPodDemo in Markdown format.
* Think: Why did you write this? What is the focus? What does it do?
* CocoaPods will be using this to generate tags, and improve search results.
* Try to keep it short, snappy and to the point.
* Finally, don't worry about the indent, CocoaPods strips it!
DESC
s.homepage = "https://github.com/goingta/MyPodDemo"
s.license = "MIT"
s.author = { "goingta" => "tangle1128@gmail.com" }
s.source = { :git => "https://github.com/goingta/MyPodDemo.git", :tag => "0.0.1" }
s.source_files = "MyPodDemo/Src", "MyPodDemo/Src/**/*.{h,m}"
s.requires_arc = true
# s.framework = "SomeFramework"
# s.frameworks = "SomeFramework", "AnotherFramework"
# s.library = "iconv"
# s.libraries = "iconv", "xml2"
# s.dependency "JSONKit", "~> 1.4"
# s.dependency "AFNetworking", "~> 2.2.4"
end
自解析:
name: 导入pod后的目录名
version: 当前版本号
deployment_target: 配置的target
prefix_header_file: 预编译头文件路径,将该文件的内容插入到Pod的pch文件内
source: 来源的具体路径,是http链接还是本地路径
requires_arc: 是否需要arc
source_files: 指定该目录下包含哪些文件
其他可选参数还包括:
dependency: 指定依赖,如果依赖的库不存在或者依赖库的版本不符合要求将会报错
libraries: 指定导入的库,比如sqlite3
frameworks: 指定导入的framework
weak_frameworks: 弱链接,比如说一个项目同时兼容iOS6和iOS7,但某一个framework只在iOS7上有,这时候如果用强链接,那么在iOS7上运行就会crash,使用weak_frameworks可以避免这种情况。
整个podspec语法是一个嵌套结构从Pod::Spec.new do
|s|到最后一个end是最大的循环,表示整个podspec导入的文件。中间每一个subspec到end结束是一个子目录,Pods会为每个
subspec创建一个逻辑目录,相当于Xcode的group概念。|**|中间是subspec的名字,可以随便命名,但后面使用的名称必须一致。
通配符说明
a{bb,bc}def.{h,m}表示四个文件abbdef.h abbdef.m abcdef.h abcdef.m
*.{h,m,mm}表示所有的.h .m .mm文件
Class/**/*.{h,m}表示Class目录下的所有.h .m文件
写完podspec文件后使用pod spec lint验证spec是否合格,有error则需要修改
spec文件验证
上传代码至github
上传podspec文件到CocoaPods仓库(fork一下,修改完成后在push上去等待审核)
将我们刚刚生成的MyPodDemo.spec 文件上传到Cocoapods官方specs仓库中 :
链接为:https://github.com/CocoaPods/Specs
私有库实现,编写podfile
如果由于某些原因我们编写的库不能公开,但是又想使用pods来进行管理,要怎么办呢?
首先我们要将我们刚刚在github上建的仓库改为Private(不然还用Public搞毛啊)
然后修改我们项目的podfile,与已加入Cocopods仓库的公有库相比我们只需要指明私有库低git地址,如下:
platform :ios, '6.0'
pod 'MyPodDemo', :git => 'https://github.com/goingta/MyPodDemo.git' //私有库
pod 'CocoaLumberjack'//公有库
版本控制和冲突(引用自http://objccn.io/issue-6-4/)
CocoaPods 使用语义版本控制 – Semantic
Versioning 命名约定来解决对版本的依赖。由于冲突解决系统建立在非重大变更的补丁版本之间,这使得解决依赖关系变得容易很多。例如,两个不同
的 pods 依赖于 CocoaLumberjack
的两个版本,假设一个依赖于2.3.1,另一个依赖于 2.3.3,此时冲突解决系统可以使用最新的版本 2.3.3,因为这个可以向后
与 2.3.1 兼容。
但这并不总是有效。有许多第三方库并不使用这样的约定,这让解决方案变得非常复杂。
当然,总会有一些冲突需要手动解决。如果一个库依赖于 CocoaLumberjack 的 1.2.5,另外一个库则依赖于 2.3.1,那么只有最终用户通过明确指定使用某个版本来解决冲突。
配置非ARC文件(8.5号补充)
前几天项目中由于历史原因,导致有一个私有的pods库中某几个文件是在非ARC时代写的,如果要进行修改工程量浩大,于是乎要对这几个文件单独处
理,这几个文件不使用arc其他文件使用arc,网上查了一些资料,只需要对source_file进行修改并排除那几个不使用ARC的文件就可以了,大
致修改如下:
Pod::Spec.new do |s| s.name = "MyPodDemo" s.version = "0.0.1" s.summary = "A short description of MyPodDemo. s.homepage = "https://github.com/goingta/MyPodDemo" s.license = "MIT" s.author = { "goingta" => "tangle1128@gmail.com" } s.source = { :git => "https://github.com/goingta/MyPodDemo.git", :tag => "0.0.1" } s.source_files = "MyPodDemo"non_arc_files = 'MyPodDemo/NoArcFile1.{h,m}','MyPodDemo/NoArcFile2.{h,m}'s.requires_arc = trues.exclude_files = non_arc_filess.subspec 'no-arc' do |sna|sna.requires_arc = falsesna.source_files = non_arc_filesendend
回退Cocoapods历史版本(2015.3.17号补充)
查看当前安装了哪些版本
gem list --local | grep cocoapods
如果你安装了多个版本(如0.35和0.20.2)那么你将看到
cocoapods (0.34, 0.20.2)
cocoapods-core (0.33, 0.20.2)
cocoapods-downloader (0.2.0, 0.1.2)
先删除已经装过的版本(可能有几个,卸载的时候会让你输入1,2..n选择卸载那个版本
sudo gem uninstall cocoapods
或者强制卸载某一个版本
gem uninstall cocoapods -v 0.20.2
安装某一个版本
sudo gem install cocoapods -v 0.35.0
处理 Use the `$(inherited)` flag 异常(2015.6.03补充)
有时候在pod update之后会遇到下面错误:
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
虽然对项目编译没什么影响,但是看着还是挺不舒服的.解决办法就是
找到工程的 targets 点击工程名 Build Settings -> Other linker flags -> 添加 $(inherited)
Cocoapods制作
1、创建podspec文件
创建命令
$ pod speccreateLXToolBar
podspec内容设置
## Be sure to run `pod spec lint LXToolBar.podspec' to ensure this is a# valid spec and to remove all comments including this before submitting the spec.## To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/#Pod::Spec.newdo|s| s.name ="LXToolBar"s.version ="0.0.1"s.summary ="定制的工具条,类似UITabBar,使用AutoLayout技术,支持横竖屏切换"s.homepage ="https://github.com/xx-li/LXToolBar"s.license ='MIT's.author = {"xx-li"=>"13348782277@163.com"} s.platform = :ios,'6.0's.source = { :git =>"https://github.com/xx-li/LXToolBar.git", :tag =>"0.0.1"} s.source_files ='LXToolBar/*','LXToolBar/**/*.{h,m}'s.exclude_files ='LXToolBarDemo's.frameworks ='Foundation','CoreGraphics','UIKit's.requires_arc =true# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }s.dependency"LXLayoutButton","~> 0.0.1"end
2、本地git仓库修改内容上传到github仓库
$git add -A&& git commit -m"Release 1.0.0."$git tag'1.0.0'$git push --tags$git push origin master
该文件是ruby文件,里面的条目都很容易知道含义。
其中需要说明的又几个参数:
s.license
Pods依赖库使用的license类型,大家填上自己对应的选择即可。
s.source_files
表示源文件的路径,注意这个路径是相对podspec文件而言的。
s.frameworks
需要用到的frameworks,不需要加.frameworks后缀。
3、上传
CocoaPods 0.33中加入了Trunk服务。
要想使用Trunk服务,首先你需要注册自己的电脑。这很简单,只要你指明你的邮箱地址(一般为spec文件中的)和名称即可。
$pod trunk register13348782277@163.com"xx-li"--description='你的描述'
至此,可以通过以下命令来方便地发布和升级你的Pod!可以在后面加--verbose来查看log
$ pod trunkpushNAME.podspec
当然,如果你的pod是由多人维护的,你也可以添加其他维护者
podtrunk add-owner ARAnalytics kyle@cocoapods.org
4、碰到的问题
使用pod trunk register 13348782277@163.com "xx-li"无法收到邮件
将邮箱换成QQ邮箱后OK
执行pod trunk register无法收到邮件,然后换成其他邮箱执行push,报错:[!] You are not allowed to push new versions for this pod.
可以先调用pod trunk me查看当前电脑注册的信息
lixinxingdeiMac:LXLayoutButtonlixinxing$pod trunk me -Name:xx-li -Email:x@devlxx.com -Since:November10th,02:47-Pods:-LXToolBar-Sessions:-November10th,02:47-March18th,201600:34.IP:218.17.157.19Description:iMac27-November11th,00:38-March18th,201600:52.IP:218.17.157.19Description:iMac27-November11th,00:55-March18th,201601:14.IP:218.17.157.19Description:iMac27
可以调用pod trunk info LXLayoutButton查看被禁止的pod的信息
lixinxingdeiMac:LXLayoutButtonlixinxing$podtrunkinfoLXLayoutButtonLXLayoutButton-Versions:-0.0.1(2015-04-1301:47:39UTC)-Owners:-xx-li<13348782277@163.com>
如果刚好此pod所拥有的这个邮箱无法收到邮件,那就只有更换邮箱了,更换邮箱需要申诉
5、参考博文
Publish Your Pods on CocoaPods with Trunk
1.怎么查看本地有多少个repos呢?
命令 pod repo可以知道本地有几个repo!!
SZ-lingdaiping:TestPodFrameworkDemo yohunl$ pod repo
master
- Type: git (master)
- URL:https://github.com/CocoaPods/Specs.git
- Path: /Users/yohunl/.cocoapods/repos/master
1 repo
刚刚从中可以看出,其不仅列出了本地共有多少个repo,还包括每个repo的地址
2.对于一个repo下有很多个podspec,例如master下有成百上千个,那么我们怎么统一验证他们是否都符合规范呢?
例如我们可以用命令进入~/.cocoapods/repos/yohunlPodSpecs下执行的pod
repo lint .(有一个点的)是验证这个repo下所有的
/Users/yohunl/.cocoapods/repos/yohunl
SZ-lingdaiping:yohunl yohunl$ pod repo lint .
Linting spec repo `yohunl`
.
Analyzed 1 podspecs files.
All the specs passed validation.
3.cocoapods的常用命令
pod list 列出所有可用的第三方库
pod search query 搜包含query的第三方库 注意:这两个命令只搜存在于本地/Users/yohunl/.cocoapods/ 下的文件
如果搜索网络的,可以先更新本地 pod repo update master,然后再搜索
pod lib create frameworkName 创建一个framework工程
pod lib lint 验证一个podspec文件是否有错误
podinstall--no-repo-update错误
这里的参数—no-repo-update,是告诉cocoapods不要更新repo.有么有感觉每次pod install都很慢,那是因为每一次都会先更新本地的repo,加上此参数,就跳过了这个过程,将会很快
pod init 可以建立一个空的podfile
建立pod的spec文件 pod spec create spec名字http://www.theonlylars.com/blog/2013/01/20/cocoapods-creating-a-pod-spec/
pod install命令时会引发许多操作。要想深入了解这个命令执行的详细内容,可以在这个命令后面加上--verbose
4.其它使用我们建立的framework的方式
当我们添加
source'https://github.com/yohunl/yohunlSpecs.git'
source'https://github.com/CocoaPods/Specs.git'
并且执行pod install后
进入.cocoapods文件夹,可以看到 又多了一个repo:yohunl!!!
这说明什么问题呢?
这说明我么之前的
pod repo add yohunlSpecs git@github.com:yohunl/yohunlSpecs.git
pod repo push yohunlSpecs YohunlUtilsPod.podspec
这两句话只是为了给https://github.com/yohunl/yohunlSpecs中添加spec文件啊.当添加完成后,其实我们可以删除添加到本地的repo了
删除repo的命令
pod repo remove yohunlSpecs [pod repo remove repo名称]
我们删除我们添加的私有库 [哈哈,其实你都显示了隐藏目录了,也可以直接进去直接删除文件夹的!]
pod repo remove yohunl
pod repo remove yohunlSpecs
删除后,可以看到
你再执行pod install
发现 系统会自己根据
source'https://github.com/yohunl/yohunlSpecs.git'
source'https://github.com/CocoaPods/Specs.git'
去下载对应的repos
如果不加入repos(也就是不添加podspec文件到系统的.cocopods文件夹下).能不能使用cocoapods呢?也是可以的
target 'TestPodFrameworkDemo' do
pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod'
end
target 'TestPodFrameworkDemoTests' do
end
当我们下载了一个含有podspec文件的代码后,如果想使用它,可以直接通过pod的path指定路径 (以前还可以使用 :local,不过现在已经被:path取代了)..cocopods文件夹下的 注意:此处:path后面的路径是指podspec文件所在目录的路径
执行 pod install
也是可以的
不过这种方式添加的,cocoapods会放在 Development Pods文件夹下
下面这种方式也是可以的 ,并不需要将podspec加入到私有仓库
#source 'https://github.com/yohunl/yohunlSpecs.git'
#source 'https://github.com/CocoaPods/Specs.git'
target 'TestPodFrameworkDemo' do
#pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod'
pod 'YohunlUtilsPod',:git => 'https://github.com/yohunl/YohunlUtilsPod.git'
end
target 'TestPodFrameworkDemoTests' do
end
还有以下的方式
#pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' #可以
#pod 'YohunlUtilsPod',:git => 'https://github.com/yohunl/YohunlUtilsPod.git' #可以
#pod 'YohunlUtilsPod',:podspec => '/Users/yohunl/YohunlUtilsPod/YohunlUtilsPod.podspec' #指定podspec文件,可以
#pod 'YohunlUtilsPod',:podspec => 'https://github.com/yohunl/YohunlUtilsPod/blob/master/YohunlUtilsPod.podspec' #经过测试,这种方式不行
#pod 'YohunlUtilsPod',:podspec =&
gt; 'https://github.com/yohunl/YohunlUtilsPod.git/YohunlUtilsPod
/YohunlUtilsPod.podspec' #测试不行,提示找不到podspec文件
如果你能够确定你的podspec文件是正确可用的话,完全可以直接向https://github.com/yohunl/yohunlSpecs添加podspec文件(当然要符合格式要求哦)
5.打包framework的第三方插件命令
cocoapods的插件cocoapods-packager来完成类库的打包,安装命令sudo gem install cocoapods-packager 它的好处是,需要特别强调的是,该插件通过对引用的三方库进行重命名很好的解决了类库命名冲突的问题
参考文档
http://www.cnblogs.com/brycezhang/p/4117180.html使用CocoaPods开发并打包静态库
http://www.iwangke.me/2013/04/18/advanced-cocoapods/#jtss-tsina
http://www.iwangke.me/2013/04/18/advanced-cocoapods/
http://eric-gao.iteye.com/blog/2128283提交framework到cocoapods官方去
http://www.cocoachina.com/ios/20150508/11785.html建立私有库
http://blog.sigmapoint.pl/automatic-build-of-static-library-for-ios-for-many-architectures/
时间 2014-11-12 00:00:00iloss
原文http://www.iloss.me/post/kai-fa/2014-11-12-creat-pod
之前有写过一次自己制作pods提交到cocoapods但是2014年5月20日Cocoapods不在接受向CocoaPods/Specs的pull request,改为trunk服务。
以前我们用的podspec为ruby格式,而trunk带来了更方便的json格式,以后可以用json来配置pod。 之前我们发布的pod也会转换未json文件
准备
首先更新了用trunk之后,CocoaPods 需要0.33版本以上的,用pod --version查看,如果版本低,需要更新,之前有介绍更新方法。
下一步注册trunk
pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
你注册的时候需要替换邮箱和名字,加上--verbose可以看到详细信息。
然后顺利的话你会收到一份邮件,需要点击验证。
pod trunk me //查看自己的注册信息
当然,如果你的pod是由多人维护的,你也可以添加其他维护者
pod trunk add-owner ARAnalytics kyle@cocoapods.org
创建podspec
执行命令:
pod spec create HZWebViewController
会在当前目录下生成HZWebViewController.podspec文件,然后我们编辑这个文件。
podspec文件里面有很多注释。我们看个例子
一眼看去就很明白了,不用一一解释了,当然,这里的配置项远远多于这些。
ok这里配置完成之后,需要把你的源码push到github上,tag一个版本号并且发布一个release版本,这样podspec文件中的s.source的值才能是准确的。
这些操作也不属于本文的所研究的范畴。
提交
上面的工作完成之后,我们就可以开始trunk push了
pod trunk push命令会首先验证你本地的podspec文件(是否有错误),之后会上传spec文件到trunk,最后会将你上传的podspec文件转换为需要的json文件
第一步验证podspec文件也可以自己去做pod spec lint Peanut.podspec
成功部署之后,CocoaPods会在Twitter上@你
我们可以看看我们提交的名字为:HZWebViewController的pod
pod search HZWebViewController
我们也可以在本地的~/.cocoapods路径下看到,转换之后的json文件
补充 Claim your Pod
如果你之前提交过pod,那么trunk之后你需要去(Claim your Pod)认领
在这个页面:https://trunk.cocoapods.org/claims/new
输入你的信息,如下图:
send之后就开始等待,官方提示是过了过渡期就你就可以提交新版本了
这样就愉快的结束了