A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Simpon 中级黑马   /  2016-5-6 18:03  /  4270 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Simpon 于 2016-10-19 13:34 编辑

一、如何制作自己的Cocopods库
1.在github上新建一个工程

github上新建pod工程


license类型
正规的仓库都应该有一个license文件,Pods依赖库对这个文件的要求更严,是必须要有的。因此最好在这里让github创建一个,也可以自己后续再创建。我使用的license类型是MIT。
把项目clone到本地然后在根目录下新建MyPodDemo.podspec
或使用命令
  1. $ pod spec create MyPodDemo
复制代码
Spec文件编写:

  1. Pod::Spec.new do |s|
  2. s.name = "MyPodDemo"
  3. s.version = "0.0.1"
  4. s.summary = "A short description of MyPodDemo."
  5. s.description = <<-DESC
  6. A longer description of MyPodDemo in Markdown format.
  7. * Think: Why did you write this? What is the focus? What does it do?
  8. * CocoaPods will be using this to generate tags, and improve search results.
  9. * Try to keep it short, snappy and to the point.
  10. * Finally, don't worry about the indent, CocoaPods strips it!
  11. DESC
  12. s.homepage = "https://github.com/goingta/MyPodDemo"
  13. s.license = "MIT"
  14. s.author = { "goingta" => "tangle1128@gmail.com" }
  15. s.source = { :git => "https://github.com/goingta/MyPodDemo.git", :tag => "0.0.1" }
  16. s.source_files = "MyPodDemo/Src", "MyPodDemo/Src/**/*.{h,m}"
  17. s.requires_arc = true
  18. # s.framework = "SomeFramework"
  19. # s.frameworks = "SomeFramework", "AnotherFramework"
  20. # s.library = "iconv"
  21. # s.libraries = "iconv", "xml2"
  22. # s.dependency "JSONKit", "~> 1.4"
  23. # s.dependency "AFNetworking", "~> 2.2.4"
  24. end
复制代码

自解析:
  1. name: 导入pod后的目录名
  2. version: 当前版本号
  3. deployment_target: 配置的target
  4. prefix_header_file: 预编译头文件路径,将该文件的内容插入到Pod的pch文件内
  5. source: 来源的具体路径,是http链接还是本地路径
  6. requires_arc: 是否需要arc
  7. source_files: 指定该目录下包含哪些文件
  8. 其他可选参数还包括:
  9. dependency: 指定依赖,如果依赖的库不存在或者依赖库的版本不符合要求将会报错
  10. libraries: 指定导入的库,比如sqlite3
  11. frameworks: 指定导入的framework
  12. weak_frameworks: 弱链接,比如说一个项目同时兼容iOS6和iOS7,但某一个framework只在iOS7上有,这时候如果用强链接,那么在iOS7上运行就会crash,使用weak_frameworks可以避免这种情况。
复制代码



通配符说明


  1. a{bb,bc}def.{h,m}表示四个文件abbdef.h abbdef.m abcdef.h abcdef.m
  2. *.{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地址,如下:
  1. platform :ios, '6.0'
复制代码

四、版本控制和冲突(引用自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文件

前几天项目中由于历史原因,导致有一个私有的pods库中某几个文件是在非ARC时代写的,如果要进行修改工程量浩大,于是乎要对这几个文件单独处理,这几个文件不使用arc其他文件使用arc,网上查了一些资料,只需要对source_file进行修改并排除那几个不使用ARC的文件就可以了,大致修改如下:

  1. Pod::Spec.new do |s|
  2. s.name = "MyPodDemo"
  3. s.version = "0.0.1"
  4. s.summary = "A short description of MyPodDemo.
  5. s.homepage = "https://github.com/goingta/MyPodDemo"
  6. s.license = "MIT"
  7. s.author = { "goingta" => "tangle1128@gmail.com" }
  8. s.source = { :git => "https://github.com/goingta/MyPodDemo.git", :tag => "0.0.1" }
  9. s.source_files = "MyPodDemo"
  10. non_arc_files = 'MyPodDemo/NoArcFile1.{h,m}','MyPodDemo/NoArcFile2.{h,m}'
  11. s.requires_arc = true

  12. s.exclude_files = non_arc_files
  13. s.subspec 'no-arc' do |sna|
  14. sna.requires_arc = false
  15. sna.source_files = non_arc_files
  16. end
  17. end
复制代码

六、回退Cocoapods历史版
先删除已经装过的版本(可能有几个,卸载的时候会让你输入1,2..n选择卸载那个版本
  1. sudo gem uninstall cocoapods
复制代码
安装某一个版本
  1. sudo gem install cocoapods -v 0.35.0
复制代码

精华推荐:


3 个回复

倒序浏览
好强大帖子,太有内涵了,666...
回复 使用道具 举报
压根看不懂啊  哈哈哈哈哈哈哈哈
回复 使用道具 举报
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马