cocoapods系列教程---安装与使用
cocoapods系列教程---Podfile文件
cocoapods系列教程---Podfile.lock文件 和 Spec Repo
cocoapods系列教程---spec文件
cocoapods系列教程---原理篇
cocoapods系列教程---让自己的开源框架支持cocoapods
cocoapods系列教程---模块化设计
cocoapods系列教程---创建私有pods
参考:http://studentdeng.github.io/blog/2013/09/13/cocoapods-tutorial/
提交代码到代码托管平台
既然是开源,要求代码任何人都能够访问,这里选择github,当然也可以用其他平台如oschina等,项目必须是公开项目.比如我的这个:https://github.com/iOSSinger/SGExtension.git
创建spec文件
-
将代码克隆到本地,如果本地已经存在,直接跳过这一步.
-
创建.podspec文件,切换到项目根目录,创建spec文件:
//切换到项目根目录 cd SGExtenion //创建spec文件 pod spec create SGExtension
-
用xcode打开
SGExtension.podspec
,里面有英文注释,我这里直接给简单模板,其实就是去掉了注释,详细的设置看这里
Pod::Spec.new do |spec|
spec.name = 'SGExtension'
spec.version = '1.0.2'
spec.ios.deployment_target = '8.0'
spec.license = 'MIT'
spec.homepage = 'https://github.com/iOSSinger'
spec.author = { "iOSSinger" => "747616044@qq.com" }
spec.summary = '各种工具的合集'
spec.source = { :git => 'https://github.com/iOSSinger/SGExtension.git', :tag => spec.version }
spec.source_files = "SGExtension/**/{*.h,*.m}"
spec.resources = "SGExtension/source.bundle"
spec.frameworks = 'UIKit'
spec.library = 'z'
spec.requires_arc = true
end
解释下每行的意思:
-
spec.name
名字,pod search 搜索的关键词,注意这里一定要和.podspec的名称一样,否则报错 -
spec.version
版本号 -
spec.ios.deployment_target
支持的ios最低版本 -
spec.license
许可证,一般MIT,这里提醒一下,根目录下必须要有LICENSE这个文件,可以直接把我项目中的copy一份,改下作者名字即可.一般github创建仓库的时候可以选择许可为MIT,会自动帮你生成该文件. -
spec.homepage
项目主页地址,要求必须能访问 -
spec.author
作者信息 -
spec.summary
项目简介 -
spec.source
项目的地址,填上项目的github地址,tag => spec.version
表示git项目的tag值与上面的spec的版本一致,这里是1.0.2
. -
spec.source_files
项目源文件,主要是.h和.m文件,- *表示匹配所有文件
- {.h,.m} 表示匹配所有以.h和.m结尾的文件
- ** 表示匹配所有子目录,以及递归子目录
-
spec.resources
项目所需的资源文件,比如图片 -
spec.frameworks
项目的依赖框架,比如UIKit,不需要后缀名 -
spec.library
项目依赖的库文件(这个是系统的库文件),不需要后缀名,比如sqlite,libz等.以lib开头的
需要省略掉lib
这三个字母.例如:libz
需要简写为z
否则报错. -
spec.requires_arc
是否是arc,一般true
如果你的项目依赖了别的pod项目,可以这样写:
spec.dependency = 'AFNetworking'
提交代码,并打上tag
//提交代码
git push
//打tag
git tag 1.0.2
//将tag推送到远端
git push origin --tags
附上目录:
Paste_Image.png验证podspec文件
pod spec lint SGExtemnsion.podspec
这一步如果报错,根据错误自行修改,根据大致意思能看出来个大概,终端会给出哪一行出错了.一般就是语法错误,资源找不到,git地址不对或者不能访问.指定的文件如{.h,.m}找不到,一般再检查检查基本没问题.
2018.1更新: 有时候明明代码没问题(很确定),但是还是不通过,可以尝试清理下缓存:
//获取已经缓存的列表
pod cache list
//清除指定的缓存
pod cache clean xxx(缓存的名字,上一步可获取)
注册trunk,并提交spec文件cocoapods仓库
-
注册chunk,查看是否注册过
pod trunk me
-
如果没有注册,那么注册:
pod trunk register 747616044@qq.com "iOSSinger"
填上
邮箱
和用户名
就可以了.注册完成之后会给你的邮箱发个邮件,进入邮箱邮件里面有个链接,需要点击确认一下.然后再查看下是否注册成功:pod trunk me
-
提交spec文件到 CocoaPods 中心仓库
pod trunk push SGExtension.podspec
如果前面都没问题,这一步基本也没啥问题.不过网速比较慢可能要等很久,这一步建议翻墙,不然有可能真的很慢.
-
然后验证一下,是否可以查到
pod search SGExtension
如果能够查到,恭喜你 !,如果查不到,往下看
-
解决方案:
- 查看上一步(提交到代码仓库)是否成功,再次执行提交:
pod trunk push SGExtension.podspec
如果出现如下信息:
[!] Unable to accept duplicate entry for: SGExtension (1.0.2)
那么说明已经提交到cocoapods仓库成功,那么有可能就是本地仓库没有更新.更新本地仓库:
pod repo update
- 再次执行
pod search SGExtension
命令,如果还搜索不到,继续往下看:
rm ~/Library/Caches/CocoaPods/search_index.json
这句话是移除已经生成的搜索目录缓存文件,移除之后,执行
pod search
会重新生成一份最新的缓存列表,基本到这里就差不多了.-
如果还有问题,那就需要终极大招,但是不推荐用,时间很长,除非翻墙.
pod repo remove master pod setup
或者
sudo rm -fr ~/.cocoapods/repos/master pod setup
这两种写法的意思都是移除本地cocoapods仓库,重新从官网拉取一遍.可能时间比较长,所以不建议用,如果网速度快可以考虑使用,也可以翻墙.整个仓库打下大约500M+(截止当前时间).
集成到项目中试试
target '项目名' do
pod 'SGExtension'
end
多人共同维护你的开源项目
如果需要多个人维护一个库,每个人都应该有权限push提交spec文件;第一个push的人可以被认为是管理员,可以再添加子管理员,这样子管理员就有权限push了
pod trunk add-owner 邮箱地址
移除某个管理员
pod trunk remove-owner 邮箱地址
* pod lib lint
和 pod spec lint
有什么区别
- pod lib lint 不需要联网
- pod spec lint 会联网检查sepc repo,并且关联tag
大功告成,喝杯12年的拉菲睡一觉~.
网友评论
我发现执行pod install后,在pod.xcproject中, 每个repo的header search paths 都会含有各个repo的头文件,无法在项目编译时检查出各个组件的依赖。
想问问楼主,有什么idea可以帮助我一下吗?😄
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_UdeskManager", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
这是错误信息。
Pod::Spec.new do |spec|
spec.name = 'XuchenSDKTest'
spec.version = '0.0.7'
spec.license = 'MIT'
spec.summary = 'test sdk'
spec.homepage = 'https://github.com/xushichen/XuchenSDKTest'
spec.author = {'xuchen ' => 'xuc@udesk.cn'}
spec.source = {:git => 'https://github.com/xushichen/XuchenSDKTest.git', :tag => spec.version.to_s }
spec.source_files = 'UdeskSDK/**/*.{h,m}'
spec.platform = :ios, '6.0'
spec.requires_arc = true
spec.frameworks = 'AVFoundation', 'CoreTelephony', 'SystemConfiguration', 'MobileCoreServices'
spec.libraries = 'z', 'xml2', 'resolv', 'sqlite3'
spec.resource = 'UdeskSDK/Resource/UdeskBundle.bundle'
spec.vendored_libraries = 'UdeskSDK/Lib/libUdesk.a'
spec.xcconfig = {'OTHER_LDFLAGS' => '-ObjC',
'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2'}
end
这是我的podspec。