来一发cocoapods相关吧

以前只会pod install....
有必要搞清楚cocoaPods到底在干嘛。

CocoaPods是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用CocoaPods,可以定义自己的依赖关系(称作pods)。
cocoaPods为我们做了两件事:
1>在工程中引入第三方代码会涉及到的工程文件的配置,build phases和linker flags,它能自动配置编译选项。
2>通过CocoaPods,可以很方便的查找到新的第三方库。

CocoaPods是一个objc的依赖管理工具,而其本身是利用ruby的依赖管理gem进行构建的。

Cocoapods是用ruby写的,并由若干个ruby包(gems)构成的。在解析整合过程中,最重要的几个gems分别是:
CocoaPods/CocoaPods ,
CocoaPods/Core,
CocoaPods/Xcodeproj

分别看下这几个gems干了什么事儿

CocoaPods/CocoaPods

这是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用CocoaPods涉及到的功能,并且还能通过调用所有其他的gems来执行任务。

CocoaPods/Core

Core组件提供支持与CocoaPods相关文件的处理,文件主要是Podfile和podspecs。
podfile:是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制。
podspec:.podspec也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。

CocoaPods的安装

MAC下自带ruby,使用ruby的gem命令即可下载安装:
sudo gem install cocoapods
pod setup

如果gem比较老,可以试试升级gem:
sudo gem update --system
另外,ruby的软件源 https://rubygems.org 因为使用的是亚马逊的云服务,所以被墙了,需要更新一下ruby的源,将官方的ruby源替换成国内淘宝的源:
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l

CocoaPods的镜像索引

所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的~/.cocoapods/目录下,这个索引文件比较大,有80M左右,所以第一次更新时非常慢。

使用CocoaPods

使用时需要新建一个名为Podfile的文件,以如下格式,将依赖的库名字写在该文件中:
platform :ios
pod 'JSONKit', '~> 1.4'
pod 'Reachability', '~> 3.0.0'
pod 'ASIHTTPRequest'
pod 'RegexKitLite'

然后将编辑好的Podfile文件放到你的项目根目录中,执行如下命令即可:
pod install
现在你的所有第三方库都已经下载完成并且设置好了编译参数和依赖。

关于Podfile.lock

当你执行pod install之后,除了Podfile外,CocoaPods还会生成一个名为Podfile.lock的文件,Podfile.lock应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。

为自己的项目创建podspec文件:

我们可以为自己的开源项目创建podspec文件,首先通过如下命令初始化一个podspec文件:
pod spec create your_pod_spec_name
该命令执行之后,CocoaPods会生成一个名为your_pod_spec_name.podspec的文件,然后我们修改其中的相关内容即可。

如何编写一个CocoaPods的spec文件
为自己的项目编写Podspec文件:
初始化一个Podspec文件:
pod spec create weibo_ios_sdk_sso-oauth
该命令将在本目录产生一个名为weibo_ios_sdk_sso-oauth.podspec的文件。

如何声明第三方库的代码目录和资源目录,还有该第三方库所依赖iOS核心框架和第三方库?
podspec文件大致如下:

Pod::Spec.new do |s|
  s.name     = 'ADVProgressBar'   //声明库的名称。pod search命令就是根据s.name 和 s.summary作为搜索文本的
  s.version  = '0.0.1'    //声明库源代码的版本
  s.license  = 'MIT'      //采取的授权版本
  s.summary  = 'Progress Bar Design with Percentage values.'    //声明一个简短的说明文档
  s.homepage = 'https://github.com/appdesignvault'    //声明库的主页
  s.author   = { 'appdesignvault' => 'appdesignvault' }    //库的作者
  s.source   = { :git => 'https://github.com/appdesignvault/ADVProgressBar.git', :commit => 'f17b15c15574d6d101cd5fcfd58239e16e806647' }       //声明源代码的地址。对于很多第三方库而言,在发布的时候都会打上一个tag,如版本0.0.1就会打上一个名为v0.0.1的tag,但是但是weibo_ios_sdk_sso-oauth库还未打上任何tag,我们可以选择一个最新的commit来作为该库0.0.1版的代码。以后我们可以根据该库不同的版本创建相应的pod spec文件。
  s.platform = :ios  
  s.source_files = 'ADVProgressBar/Classes/*.{h,m}'
  s.resources = "ADVProgressBar/Resources/*.png"
  s.framework = 'UIKit'

  s.requires_arc = true  
end

weibo_ios_sdk_sso-oauth的目录结构:

目录结构

demo目录保存一个示例项目,src才是库的源代码目录。src的目录结构如下:

src的目录结构

JSONKit目录说明这个库本身依赖于JSONKit第三方库。我们可以在podspec文件中的s.dependency声明段中声明。
s.dependency 'JSONKit', '~>1.4'

SinaWeibo目录才是包含了所有源代码的目录,我们需要在s.source_files中声明
s.source_files = 'src/SinaWeibo/.{h,m}'
前一部分src/SinaWeibo/是一个相对目录,目录的层级关系一定要跟代码库的保持一致。最后一部分
.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h和.m为扩展名的文件。

src/SinWeibo/目录下还有一个SinaWeibo.bundle目录,该目录存放一些资源文件(如图片等),这些文件并不需要进行编译。可以使用s.resources声明:
s.resources = "src/SinaWeibo/SinaWeibo.bundle//.png"
前一部分跟上面相同,
表示匹配所有子目录,.png表示所有以.png为扩展名的图片文件。

weibo_ios_sdk_sso-oauth还依赖一个iOS的核心库QuartzCore
s.framework = 'QuartzCore'

最终结果如下:

Pod::Spec.new do |s|
  s.name         = "weibo_ios_sdk_sso-oauth"
  s.version      = "0.0.1"
  s.summary  = 'weibo.com sso oauth, 微博sso认证登录功能'
  s.homepage     = "https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth"
  s.license      = 'MIT'
  s.author       = {'mobileresearch' => 'mobileresearch'}
  s.source       = { :git => 'https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth.git', :commit => '68defea78942ecc782ffde8f8ffa747872af226d' }
  s.platform = :ios
  s.source_files = 'src/SinaWeibo/*.{h,m}'
  s.resources = "src/SinaWeibo/SinaWeibo.bundle/**/*.png"
  s.framework  = 'QuartzCore'
  s.dependency 'JSONKit', '~> 1.4'  //
end

可以将该spec文件保存到本机的~/.cocoapods/master/目录中仅供自己使用,也可以将其提交到CocoaPods/Specs代码库中。下面是将其保存到本机中:

$ mkdir -p ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1
$ cp weibo_ios_sdk_sso-oauth.podspec ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1

使用私有的pods

我们可以直接指定某一个依赖的podspec,这样就可以使用公司的私有库。该方案有利于使企业内部的公共项目支持CocoaPods。

pod 'MyCommon', :podspec => 'https://yuantiku.com/common/myCommon.podspec'

不更新podspec

CocoaPods在执行pod install和pod update时,会默认先更新一次pod spec索引。使用--no-repo-update参数可以禁止其做索引更新操作

pod install --no-repo-update
pod update --no-repo-update


原理:
CocoaPods是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。
Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a问价即可。
对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
CocoaPods通过一个名为Pods.xcconfig的文件夹在编译时设置所有的依赖和参数。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,414评论 0 39
  • CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPo...
    朝洋阅读 25,630评论 3 51
  • Ruby 安装 要安装cocospods 首先需要安装ruby,可以先安装xcode,再安装macport ,最后...
    山天大畜阅读 1,840评论 0 1
  • 一. CocoaPods的介绍 什么是CocoaPods?CocoaPods是一个负责管理iOS项目中第三方开源库...
    辉712阅读 3,911评论 0 7
  • 偏爱 独饮孤寂苦酒, 邀明月同我方休。 拥挤街头, 唯痴心无缘牵手。 图片发自简书App 薄曦烬红烛, 旧梦...
    轻风逐目阅读 211评论 0 0