iOS-Cocoapods

知 识 点 / 超 人


可以参考一下我自己的开源库是如何设置cocoapods的

目录

一、使用Cocoapods前的准备

  • 1.什么是Homebrew?
  • 2.什么是RVM?
  • 3.什么是ruby?
  • 4.什么是RubyGems?
  • 5.什么是cocoapods?

二、如何创建cocoapods私有库?
三、如何在项目中使用cocoapods库

cocoapods官方

使用Cocoapods前的准备

什么是Homebrew?

Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装卸载更新查看搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。所以我们需要下载Homebrew来安装Ruby。

安装HomeBrew步骤:

1.打开终端,输入一下命令,地址选择的国内的地址来下载安装Homebrew。然后慢慢等待即可,预计需要30分钟左右:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
image.png

Ps:建议选用中科大,如果安装Homebrew中间遇到了文件目录问题可以使用这篇文章的方法。由于我已经安装过了所以重新安装会删除之前的软件。

关于Homebrew:
1.Homebrew的命令是以brew开头 例如:brew -v 查看Homebrew版本
2.Homebrew 的默认安装目录为 /usr/local
3.通过 brew 安装的程序都会默认安装到 /usr/local/Cellars/程序名/版本号/ 目录下

Homebrew相关的使用命令:
brew -v:查看brew版本:
brew help:查看Homebrew命令
brew install <packageName> :安装任意包,例如安装rvm:brew install rvm
brew --repo : 查看路径
brew uninstall <packageName>:卸载任意包,例如卸载rvm:brew uninstall rvm
brew search <packageName>:查询可用包
brew list:查询已安装包列表
brew info <packageName>:查看任意包信息
brew update:更新Homebrew

什么是RVM?

RVM 全称是 ruby version manager, 是一个命令行工具,可以提供一个便捷的多版本 ruby 环境的管理和切换。所以我们需要下载RVM来方便我们管理Ruby。

Ps:RVM 不仅可以提供一个多 Ruby 版本共存的环境,还可以根据项目管理不同的 gemset.gemset 可以理解为是一个独立的虚拟 Gem 环境,每一个 gemset 都是相互独立的。

安装rvm步骤:

1.打开终端,如果没有安装 curl,先使用命令安装 curl (Mac一般是自带的)

curl sudo apt-get install curl

2.终端中输入安装 RVM 的命令。

\curl -sSL https://get.rvm.io | bash -s stable
  1. 加载 RVM(加载后才能使用!!)
source ~/.rvm/scripts/rvm

如果安装rvm中遇到
Failed to connect to raw.githubusercontent.com port 443: Connection refused 大概率是因为raw.githubusercontent.com域名解析被污染导致的。可以按照下面步骤操作

1.查询aw.githubusercontent.com域名真实IP 在https://www.ipaddress.com/查询raw.githubusercontent.com的真实IP。

2.进入/etc/hosts 修改hosts文件内容

  • 2.1通过finder->前往->前往文件夹
  • 2.2输入/etc/hosts后在当前文件夹中找hosts 文件。
  • 2.3到把hosts 文件复制到桌面,然后用文本编辑器打开 加上你查询到的ip地址
    例如:199.232.96.133 raw.githubusercontent.com
  • 2.4保存编辑好的hosts 文件,并替换/etc/hosts中的hosts 文件。
  • 2.5然后在重新按照上面的步骤安装RVM

RVM使用相关命名:
rvm list known:查看ruby版本
rvm install 版本号:下载指定版本的ruby,例如:rvm install 2.4.0
rvm -v:查看rvm版本
rvm use 版本号:切换ruby版本,例如:rvm use 2.2.0
rvm use 版本号 --default :切换并设置ruby版本为默认版本,例如:rvm use 2.2.0 --default
rvm remove 版本号:移除指定版本的ruby,例如:rvm remove 2.2.0
rvm implode:卸载

什么是ruby?

Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。Ruby 的特性与 SmalltalkPerlPython 类似。Perl、Python 和 Smalltalk 是脚本语言。Smalltalk 是一个真正的面向对象语言。Ruby,与 Smalltalk 一样,是一个完美的面向对象语言。使用 Ruby 的语法比使用 Smalltalk 的语法要容易得多。cocoapods就是基于ruby语言编写而成的。因此要真的很会用cocoapods,还是需要学习ruby语言的。

安装ruby步骤

1.打开终端,通过rvm查看ruby有哪些版本

rvm list known

2.然后选择你需要下载的版本,这里选择的是2.7版本(然后耐心等吧,我下了半个多小时

rvm install 2.7
什么是RubyGems

RubyGems(简称 gems)是一个用于对 Ruby组件进行打包的 Ruby 打包系统。 它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。RubyGems的功能类似于Linux下的apt-get。使用它可以方便的从远程服务器下载并安装Rails。一般使用rvm安装ruby后,会自带RubyGems。所以下载ruby后使用命令 gem -v 查看一下是否已安装了Gem。

Gem使用相关命令:
gem -v : 查看 gem 版本
gem source : 查看 gem 配置源
gem source -l : 查看 gem 配置源目录
gem sources -a url : 添加 gem 配置源(url 需换成网址)
gem sources --add url : 添加 gem 配置源(url 需换成网址)
gem sources -r url : 删除 gem 配置源(url 需换成网址)
gem sources --remove url : 删除 gem 配置源(url 需换成网址)
gem update :更新 所有包
gem update --system :更新 Ruby Gems 软件
sudo gem -v :查看 gem 版本(以管理员权限)
sudo gem install cocoa pods : 安装 CocoaPods(以管理员权限)
sudo gem install cocoapods : 安装 CocoaPods(以管理员权限)
sudo gem install cocoapods --pre : 安装 CocoaPods 至预览版(以管理员权限)
sudo gem install cocoapods -v 0.39.0 : 安装 CocoaPods 指定版本(以管理员权限)
sudo gem update cocoapods : 更新 CocoaPods 至最新版(以管理员权限)
sudo gem update cocoapods --pre : 更新 CocoaPods 至预览版(以管理员权限)
sudo gem uninstall cocoapods -v 0.39.0 : 移除 CocoaPods 指定版本(以管理员权限)

什么是cocoapods?

当语言或开发工具火热发展到一定程度时,就会涌现出很多相应的依赖管理工具,例如Java语言的Maven,nodejs的npm。随着苹果开发者的增多,业界也出现了为Xcode项目提供依赖管理的工具,这就是cocoapods。

cocoapods项目的源码在Github上管理。该项目开始于2011年8月12日,经过多年发展,现在已经成为Xcode使用者的依赖管理标配工具。作为一个iOS开发者,开发iOS项目不可避免地要使用各种第三方库,cocoapods的出现使得我们可以节省设置和更新第三方开源库的时间。

没有使用cocoapods之前,当项目需要用第三方库时,需要把这些第三方开源库的源代码文件复制到项目中,或者设置成git的submodule。还需要手工地将第三方库所依赖的系统库或其他第三方库添加到项目依赖中。某些开源库,我还需要设置-licucore或者 -fno-objc-arc等编译参数管理这些依赖包的更新。一旦第三方库更新,依赖库新增或删除。有需要重复上面的步骤。如果项目引入的第三方库较多就会非常的麻烦。

使用cocoapods后我只需要在Podfile写入需要用的第三方库。然后执行cocoapods的命令,就会自动将这些第三方库的源码下载到项目对应的Pods文件夹中,并且自动为项目工程设置好对应第三库需要依赖的系统库和编译参数等。随着组件化,MVVM等方案的不断优化。使用cocoapods维护自己的组件和核心业务越来越常见。


如何创建cocoapods私有库?

1.创建私有的repo的git库,需要新建一个git 仓库(pod repo 跟 git repo一样,都是保存的描述文件而不是源代码)


image.png
image.png

2.复制新建仓库的地址 将新建的git仓库 clone到本地,打开终端cd到你想存放该仓库的文件夹,输入git clone xxxx.git

image.png

3.cd 到仓库目录中 使用下面的命令 把git库添加为pod的repo库,该命令会把git库 clone到 本地的 cocoapods的repo仓库目录中,可以使用 open ~/.cocoapods/repos/ 查看是否clone到本地

pod repo add HYJTestCocoapodsDemo https://github.com/xkftkffz/HYJTestCocoapodsDemo.git

4.在新建的git库中,创建一个xcode项目,并提交到git上,然后在git上打一个tag。


打tag步骤1
打tag步骤2
打tag步骤3

5.cd到git仓库的根目录下,输入下面的命令,创建podspec文件(. podspec 是Pod的描述文件,spec是specification简写,podspec文件名要跟项目名一致)

//HYJTestCocoapodsDemo是我的git库名
pod spec create HYJTestCocoapodsDemo

6.配置自己的库的.podspec文件

详细的.podspec语法可以查看这一篇文章

一般新建的.podspec是一个标准的cocoapods 描述文档的模板。需要根据自己的需求来编写描述文件里的内容。

//仓库名,名称必须与HYJTestCocoapodsDemo.podspec文件名相同
 spec.name  = "HYJTestCocoapodsDemo"  
//仓库当前版本号,这也是我们podfile文件指定的版本号。 每次发布版本都需要打tag标签(名称就是版本号)。需要跟git仓库的版本号一致。
 spec.version = "0.0.1"  
//仓库的简介
 spec.summary = "A short description of HYJTestCocoapodsDemo."  
//description仓库的详细简介, 在<<-DESC 与 DESC 之间编写仓库的详细简介
 spec.description = <<-DESC

Here is a detailed introduction

 DESC
 //项目远程仓库地址
spec.homepage  = "http://EXAMPLE/HYJTestCocoapodsDemo" 
//项目的社交地址,一般用git仓库的描述地址
spec.social_media_url  = "https://github.com/xkftkffz/HYJTestCocoapodsDemo"  
//框架遵循MIT的开源协议,许可证。
//除非源代码包含了LICENSE.*或者LICENCE.*文件,否则必须指定许可证文件。文件扩展名可以没有,或者是.txt,.md,.markdown。
//一般在后面校验spec文件时,这里都会报出warning警告,可以选择忽略。只有有了许可证后才不会报出警告。
 spec.license = "MIT"
//仓库作者和邮箱地址
spec.author  = { "heyujia" => 303436513@qq.com" }  
//表示仓库所有文件是否使用arc模式,默认是true
spec.requires_arc = true  

//如果项目中存在部分的mrc文件。那么需要按照下面方法标记。

//首先标记设置为false
spec.requires_arc = false  
//然后指定具体哪些文件夹里的文件或具体你的文件是arc的,没有指定的都是mrc,会自动添加-fno-objc-arc 编辑标记
spec.requires_arc = 'Classes/Arc/**'  
spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']  
//spec.requires_arc* 指定的路径表示是*arc*文件,不被指定才会被标记 *-fno-objc-arc*。
//如果你项目中文件很多,但mrc文件很少,那么这里就会非常麻烦。
//所以项目的代码结构在设计时要尽量合理。cocoapods对文件结构和代码结构解耦非常看重。
//指定项目公共头文件,就是你的库暴露给外部引用的文件。
spec.public_header_files = "HYJTestCocoapodsDemo/HYJTestCocoapodsDemo/ViewController.h"  
//顶层源文件,你的所有项目文件都必须在顶层文件目录下或者跟顶层目录文件同级或下一级。
spec.source_files = "HYJTestCocoapodsDemo/HYJTestCocoapodsDemo/ViewController.h"  
//需要被排除的文件
spec.exclude_files = "Classes/Exclude" 
 spec.ios.deployment_target = "5.0"  //iOS系统支持的最低版本号

 spec.osx.deployment_target = "10.7"  //osx系统支持的最低版本号

 spec.watchos.deployment_target = "2.0"  //watch系统支持的最低版本号

 spec.tvos.deployment_target = "9.0"  //tvOS系统支持的最低版本号

7.本地测试podspec文件

  • 7.1cd到.podspec文件目录

  • 7.2 进行本地和远程校验

//本地校验pod创建是否正常,该命令会根据podspec去编译生成静态库,检查是否能编译通过。
//所谓的本地校验是编译本地podspec所在目录的源码,而不是从podspec中source所指定的云端库地址源码去编译。
pod lib lint
//从podspec中source所指定的云端库地址源码
pod spec lint 

Lint校验常用参数:
—sources :编译时指定的源码地址。例如:pod lib lint —source https://github.com/xkftkffz/HYJTestCocoapodsDemo
—user-libraries:编译时加载依赖库的其他静态库
—allow-warnings:编译时运行有警告。因为有警告的话编译也不会过。
—verbose:显示编译详细信息

例如:pod lib lint —source https://github.com/xkftkffz/HYJTestCocoapodsDemo,master —user-libraries —allow-warnings —verbose

可能会用到的命令
pod cache list:查看pod缓存执行
pod cache clean —all:清除所有缓存
pod repo update HYJTestCocoapodsDemo:指定更新HYJTestCocoapodsDemo的库源
pod repo remove HYJTestCocoapodsDemo 可以将该仓库从本地cocoapods中移除
Ps:要先提交git库的代码到git上,在提交代码之前,需要保证.spec中的version与即将打的tag一致,然后在git上打tag,在更新本地的库源。最后在校验.spec。不然很容易报错或者提交错误文件内容。

8.向spec repo提交podspec

//打开终端,cd到.podspec文件目录
pod repo push [pod repo 工程名] xxx.podspec --verbose --allow-warnings
//因为大多数都没有license许可证,都以一般都需要--allow-warnings来忽略警告,不然无法提交上去。

三、pod库使用

1.创建Podfile文件

  • 1.1打开终端,输入一下命令

//进入你的工程目录,与工程的xcodeproj或者xcworkspace同级目录
cd /Users/xieyujia/Desktop/heyujia的gitHub/HYJTreeNodeDemo 

//创建Podfile文件
touch Podfile

2.查找你需要使用的第三方库

可以在http://cocoapods.org 中搜索对应的库,也可以直接在第三方库的git网址里找。确定你需要使用的第三方库pod名称和版本。

3.编辑Podfile文件(ruby语法写)
详细的Podfile语法可以查看这篇文章

//platform参数是标识应建立的静态库是什么平台,ios, ‘8.0’表示该工程是iOS系统项目,最低支持8.0版本。
//对于OS X可以是:osx,对于iOS可以是:ios,对于tvOS是:tvos,或者对于watchOS是:watchos。
platform :ios, '8.0' 
//install! 这个命令是cocoapods声明的一个安装命令,用于安装引入Podfile里面的依赖库

 install! 'cocoapods', //第一个参数是安装方法,剩下的参数是选择项,现在安装方法只支持’cocoapods’

 :deterministic_uuids => false, //在创建Pods项目时是否生成确定性uuid,该选项默认为true。如果项目中有重复的文件名可以设置为false来忽略。

 :integrate_targets => false //是否将安装的pods集成到用户项目中,如果设置为false, Pods将被下载并安装到Pods/目录中,但是它们不会集成到你的项目中。该选项默认为true.
/*

= 2.0,指定版本是2.0。

> 2.0,任何高于2.0的版本。

>= 2.0,版本2.0和任何更高版本。

< 2.0,任何低于2.0的版本。

<= 2.0,版本2.0和任何较低版本。

~> 0.1.2,版本0.1.2及以上到版本0.2,不含0.2。该操作符基于你在版本需求中指定的最后一个组件工作。这个例子等于>= 0.1.2与< 0.2.0相结合,并且总是匹配与你的需求相匹配的最新已知版本。

~ > 0.1.3-beta.0,Beta版和release发行版本为0.1.3,发行版本为0.2(不包括0.2)。用破折号(-)分隔的组件将不考虑版本要求。

*/

 pod 'AFNetworking', '~> 2.0’  //AFNetworking是第三方库pod名称

 pod 'Masonry'  //不指定版本号,则默认下载最新的
/*

target:定义给定块中定义的CocoaPods target和范围依赖项。target应该与Xcode target相对应。
默认情况下,target包含定义在块外部的依赖项,除非指示不要继承inherit!他们。target指定的名称应于项目target一致。

*/

target 'HYJTreeNodeDemo' do //这个target块开始

    target :TestCocoaPodsTests do//target开始

       inherit! :search_paths  //设置当前目标的继承模式。可用模式:+:complete 目标继承父模式的所有行为。目标不会从父类继承任何行为。目标只继承父类的搜索路径。

     end//TestCocoaPodsTests的target块结束

 //指定pods下载的路径,branch => 'dev'指定从dev分支下载,:tag => ‘0.7.0’指定下载0.7.0版本的代码。
  pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev' :tag => '0.7.0'

  pod 'Masonry'

end//HYJTreeNodeDemo这个target块结束

4.导入第三方库

//进入你的工程目录,与工程的xcodeproj或者xcworkspace同级目录,Podfile文件所在的目录

pod install  //根据Podfile文件内容 安装cocoapods 。pod install命令来安装新的pod,每次在Podfile中新增和删除pod都使用pod install命令。pod update命令仅用在更新指定pod到指定版本或者更新所有pod。

补充说明:
如果使用自己的私有库,需要在Pidfile中添加 source
如果指定了source则会在指定地址去下载,如果指定地址没有,则还是会去git中下载。如果指定了path,则不会去source去下载,而是直接在path指定的路径下载。

Podfile.lock记录了需要被安装的第三方库已安装的版本。如果你想知道具体使用的哪一个版本的,可以查看这个文件。

后期会补充复杂情况下Podfile的编写,android 的maven与cocoapods的对比. 项目目录结构复杂或者使用静态库的情况下,.podspec该如何编写,代码应该如何解耦才能更方便的使用.podspec。

参考:

CocoaPods 都做了什么?

CocoaPods使用总结

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