iOS-Cocoapods

知 識(shí) 點(diǎn) / 超 人


可以參考一下我自己的開源庫(kù)是如何設(shè)置cocoapods的

目錄

一、使用Cocoapods前的準(zhǔn)備

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

二、如何創(chuàng)建cocoapods私有庫(kù)?
三、如何在項(xiàng)目中使用cocoapods庫(kù)

cocoapods官方

使用Cocoapods前的準(zhǔn)備

什么是Homebrew?

Homebrew是一款Mac OS平臺(tái)下的軟件包管理工具,擁有安裝、卸載、更新、查看、搜索等很多實(shí)用的功能。簡(jiǎn)單的一條指令,就可以實(shí)現(xiàn)包管理,而不用你關(guān)心各種依賴和文件路徑的情況,十分方便快捷。所以我們需要下載Homebrew來安裝Ruby。

安裝HomeBrew步驟:

1.打開終端,輸入一下命令,地址選擇的國(guó)內(nèi)的地址來下載安裝Homebrew。然后慢慢等待即可,預(yù)計(jì)需要30分鐘左右:

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

Ps:建議選用中科大,如果安裝Homebrew中間遇到了文件目錄問題可以使用這篇文章的方法。由于我已經(jīng)安裝過了所以重新安裝會(huì)刪除之前的軟件。

關(guān)于Homebrew:
1.Homebrew的命令是以brew開頭 例如:brew -v 查看Homebrew版本
2.Homebrew 的默認(rèn)安裝目錄為 /usr/local
3.通過 brew 安裝的程序都會(huì)默認(rèn)安裝到 /usr/local/Cellars/程序名/版本號(hào)/ 目錄下

Homebrew相關(guān)的使用命令:
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, 是一個(gè)命令行工具,可以提供一個(gè)便捷的多版本 ruby 環(huán)境的管理和切換。所以我們需要下載RVM來方便我們管理Ruby。

Ps:RVM 不僅可以提供一個(gè)多 Ruby 版本共存的環(huán)境,還可以根據(jù)項(xiàng)目管理不同的 gemset.gemset 可以理解為是一個(gè)獨(dú)立的虛擬 Gem 環(huán)境,每一個(gè) gemset 都是相互獨(dú)立的。

安裝rvm步驟:

1.打開終端,如果沒有安裝 curl,先使用命令安裝 curl (Mac一般是自帶的)

curl sudo apt-get install curl

2.終端中輸入安裝 RVM 的命令。

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

如果安裝rvm中遇到
Failed to connect to raw.githubusercontent.com port 443: Connection refused 大概率是因?yàn)閞aw.githubusercontent.com域名解析被污染導(dǎo)致的。可以按照下面步驟操作

1.查詢aw.githubusercontent.com域名真實(shí)IP 在https://www.ipaddress.com/查詢r(jià)aw.githubusercontent.com的真實(shí)IP。

2.進(jìn)入/etc/hosts 修改hosts文件內(nèi)容

  • 2.1通過finder->前往->前往文件夾
  • 2.2輸入/etc/hosts后在當(dāng)前文件夾中找hosts 文件。
  • 2.3到把hosts 文件復(fù)制到桌面,然后用文本編輯器打開 加上你查詢到的ip地址
    例如:199.232.96.133 raw.githubusercontent.com
  • 2.4保存編輯好的hosts 文件,并替換/etc/hosts中的hosts 文件。
  • 2.5然后在重新按照上面的步驟安裝RVM

RVM使用相關(guān)命名:
rvm list known:查看ruby版本
rvm install 版本號(hào):下載指定版本的ruby,例如:rvm install 2.4.0
rvm -v:查看rvm版本
rvm use 版本號(hào):切換ruby版本,例如:rvm use 2.2.0
rvm use 版本號(hào) --default :切換并設(shè)置ruby版本為默認(rèn)版本,例如:rvm use 2.2.0 --default
rvm remove 版本號(hào):移除指定版本的ruby,例如:rvm remove 2.2.0
rvm implode:卸載

什么是ruby?

Ruby,一種簡(jiǎn)單快捷的面向?qū)ο螅嫦驅(qū)ο蟪绦蛟O(shè)計(jì))腳本語言,在20世紀(jì)90年代由日本人松本行弘(Yukihiro Matsumoto)開發(fā),遵守GPL協(xié)議和Ruby License。Ruby 的特性與 Smalltalk、PerlPython 類似。Perl、Python 和 Smalltalk 是腳本語言。Smalltalk 是一個(gè)真正的面向?qū)ο笳Z言。Ruby,與 Smalltalk 一樣,是一個(gè)完美的面向?qū)ο笳Z言。使用 Ruby 的語法比使用 Smalltalk 的語法要容易得多。cocoapods就是基于ruby語言編寫而成的。因此要真的很會(huì)用cocoapods,還是需要學(xué)習(xí)ruby語言的。

安裝ruby步驟

1.打開終端,通過rvm查看ruby有哪些版本

rvm list known

2.然后選擇你需要下載的版本,這里選擇的是2.7版本(然后耐心等吧,我下了半個(gè)多小時(shí)

rvm install 2.7
什么是RubyGems

RubyGems(簡(jiǎn)稱 gems)是一個(gè)用于對(duì) Ruby組件進(jìn)行打包的 Ruby 打包系統(tǒng)。 它提供一個(gè)分發(fā) Ruby 程序和庫(kù)的標(biāo)準(zhǔn)格式,還提供一個(gè)管理程序包安裝的工具。RubyGems的功能類似于Linux下的apt-get。使用它可以方便的從遠(yuǎn)程服務(wù)器下載并安裝Rails。一般使用rvm安裝ruby后,會(huì)自帶RubyGems。所以下載ruby后使用命令 gem -v 查看一下是否已安裝了Gem。

Gem使用相關(guān)命令:
gem -v : 查看 gem 版本
gem source : 查看 gem 配置源
gem source -l : 查看 gem 配置源目錄
gem sources -a url : 添加 gem 配置源(url 需換成網(wǎng)址)
gem sources --add url : 添加 gem 配置源(url 需換成網(wǎng)址)
gem sources -r url : 刪除 gem 配置源(url 需換成網(wǎng)址)
gem sources --remove url : 刪除 gem 配置源(url 需換成網(wǎng)址)
gem update :更新 所有包
gem update --system :更新 Ruby Gems 軟件
sudo gem -v :查看 gem 版本(以管理員權(quán)限)
sudo gem install cocoa pods : 安裝 CocoaPods(以管理員權(quán)限)
sudo gem install cocoapods : 安裝 CocoaPods(以管理員權(quán)限)
sudo gem install cocoapods --pre : 安裝 CocoaPods 至預(yù)覽版(以管理員權(quán)限)
sudo gem install cocoapods -v 0.39.0 : 安裝 CocoaPods 指定版本(以管理員權(quán)限)
sudo gem update cocoapods : 更新 CocoaPods 至最新版(以管理員權(quán)限)
sudo gem update cocoapods --pre : 更新 CocoaPods 至預(yù)覽版(以管理員權(quán)限)
sudo gem uninstall cocoapods -v 0.39.0 : 移除 CocoaPods 指定版本(以管理員權(quán)限)

什么是cocoapods?

當(dāng)語言或開發(fā)工具火熱發(fā)展到一定程度時(shí),就會(huì)涌現(xiàn)出很多相應(yīng)的依賴管理工具,例如Java語言的Maven,nodejs的npm。隨著蘋果開發(fā)者的增多,業(yè)界也出現(xiàn)了為Xcode項(xiàng)目提供依賴管理的工具,這就是cocoapods。

cocoapods項(xiàng)目的源碼在Github上管理。該項(xiàng)目開始于2011年8月12日,經(jīng)過多年發(fā)展,現(xiàn)在已經(jīng)成為Xcode使用者的依賴管理標(biāo)配工具。作為一個(gè)iOS開發(fā)者,開發(fā)iOS項(xiàng)目不可避免地要使用各種第三方庫(kù),cocoapods的出現(xiàn)使得我們可以節(jié)省設(shè)置和更新第三方開源庫(kù)的時(shí)間。

沒有使用cocoapods之前,當(dāng)項(xiàng)目需要用第三方庫(kù)時(shí),需要把這些第三方開源庫(kù)的源代碼文件復(fù)制到項(xiàng)目中,或者設(shè)置成git的submodule。還需要手工地將第三方庫(kù)所依賴的系統(tǒng)庫(kù)或其他第三方庫(kù)添加到項(xiàng)目依賴中。某些開源庫(kù),我還需要設(shè)置-licucore或者 -fno-objc-arc等編譯參數(shù)管理這些依賴包的更新。一旦第三方庫(kù)更新,依賴庫(kù)新增或刪除。有需要重復(fù)上面的步驟。如果項(xiàng)目引入的第三方庫(kù)較多就會(huì)非常的麻煩。

使用cocoapods后我只需要在Podfile寫入需要用的第三方庫(kù)。然后執(zhí)行cocoapods的命令,就會(huì)自動(dòng)將這些第三方庫(kù)的源碼下載到項(xiàng)目對(duì)應(yīng)的Pods文件夾中,并且自動(dòng)為項(xiàng)目工程設(shè)置好對(duì)應(yīng)第三庫(kù)需要依賴的系統(tǒng)庫(kù)和編譯參數(shù)等。隨著組件化,MVVM等方案的不斷優(yōu)化。使用cocoapods維護(hù)自己的組件和核心業(yè)務(wù)越來越常見。


如何創(chuàng)建cocoapods私有庫(kù)?

1.創(chuàng)建私有的repo的git庫(kù),需要新建一個(gè)git 倉(cāng)庫(kù)(pod repo 跟 git repo一樣,都是保存的描述文件而不是源代碼)


image.png
image.png

2.復(fù)制新建倉(cāng)庫(kù)的地址 將新建的git倉(cāng)庫(kù) clone到本地,打開終端cd到你想存放該倉(cāng)庫(kù)的文件夾,輸入git clone xxxx.git

image.png

3.cd 到倉(cāng)庫(kù)目錄中 使用下面的命令 把git庫(kù)添加為pod的repo庫(kù),該命令會(huì)把git庫(kù) clone到 本地的 cocoapods的repo倉(cāng)庫(kù)目錄中,可以使用 open ~/.cocoapods/repos/ 查看是否clone到本地

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

4.在新建的git庫(kù)中,創(chuàng)建一個(gè)xcode項(xiàng)目,并提交到git上,然后在git上打一個(gè)tag。


打tag步驟1
打tag步驟2
打tag步驟3

5.cd到git倉(cāng)庫(kù)的根目錄下,輸入下面的命令,創(chuàng)建podspec文件(. podspec 是Pod的描述文件,spec是specification簡(jiǎn)寫,podspec文件名要跟項(xiàng)目名一致)

//HYJTestCocoapodsDemo是我的git庫(kù)名
pod spec create HYJTestCocoapodsDemo

6.配置自己的庫(kù)的.podspec文件

詳細(xì)的.podspec語法可以查看這一篇文章

一般新建的.podspec是一個(gè)標(biāo)準(zhǔn)的cocoapods 描述文檔的模板。需要根據(jù)自己的需求來編寫描述文件里的內(nèi)容。

//倉(cāng)庫(kù)名,名稱必須與HYJTestCocoapodsDemo.podspec文件名相同
 spec.name  = "HYJTestCocoapodsDemo"  
//倉(cāng)庫(kù)當(dāng)前版本號(hào),這也是我們podfile文件指定的版本號(hào)。 每次發(fā)布版本都需要打tag標(biāo)簽(名稱就是版本號(hào))。需要跟git倉(cāng)庫(kù)的版本號(hào)一致。
 spec.version = "0.0.1"  
//倉(cāng)庫(kù)的簡(jiǎn)介
 spec.summary = "A short description of HYJTestCocoapodsDemo."  
//description倉(cāng)庫(kù)的詳細(xì)簡(jiǎn)介, 在<<-DESC 與 DESC 之間編寫倉(cāng)庫(kù)的詳細(xì)簡(jiǎn)介
 spec.description = <<-DESC

Here is a detailed introduction

 DESC
 //項(xiàng)目遠(yuǎn)程倉(cāng)庫(kù)地址
spec.homepage  = "http://EXAMPLE/HYJTestCocoapodsDemo" 
//項(xiàng)目的社交地址,一般用git倉(cāng)庫(kù)的描述地址
spec.social_media_url  = "https://github.com/xkftkffz/HYJTestCocoapodsDemo"  
//框架遵循MIT的開源協(xié)議,許可證。
//除非源代碼包含了LICENSE.*或者LICENCE.*文件,否則必須指定許可證文件。文件擴(kuò)展名可以沒有,或者是.txt,.md,.markdown。
//一般在后面校驗(yàn)spec文件時(shí),這里都會(huì)報(bào)出warning警告,可以選擇忽略。只有有了許可證后才不會(huì)報(bào)出警告。
 spec.license = "MIT"
//倉(cāng)庫(kù)作者和郵箱地址
spec.author  = { "heyujia" => 303436513@qq.com" }  
//表示倉(cāng)庫(kù)所有文件是否使用arc模式,默認(rèn)是true
spec.requires_arc = true  

//如果項(xiàng)目中存在部分的mrc文件。那么需要按照下面方法標(biāo)記。

//首先標(biāo)記設(shè)置為false
spec.requires_arc = false  
//然后指定具體哪些文件夾里的文件或具體你的文件是arc的,沒有指定的都是mrc,會(huì)自動(dòng)添加-fno-objc-arc 編輯標(biāo)記
spec.requires_arc = 'Classes/Arc/**'  
spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']  
//spec.requires_arc* 指定的路徑表示是*arc*文件,不被指定才會(huì)被標(biāo)記 *-fno-objc-arc*。
//如果你項(xiàng)目中文件很多,但mrc文件很少,那么這里就會(huì)非常麻煩。
//所以項(xiàng)目的代碼結(jié)構(gòu)在設(shè)計(jì)時(shí)要盡量合理。cocoapods對(duì)文件結(jié)構(gòu)和代碼結(jié)構(gòu)解耦非??粗亍?
//指定項(xiàng)目公共頭文件,就是你的庫(kù)暴露給外部引用的文件。
spec.public_header_files = "HYJTestCocoapodsDemo/HYJTestCocoapodsDemo/ViewController.h"  
//頂層源文件,你的所有項(xiàng)目文件都必須在頂層文件目錄下或者跟頂層目錄文件同級(jí)或下一級(jí)。
spec.source_files = "HYJTestCocoapodsDemo/HYJTestCocoapodsDemo/ViewController.h"  
//需要被排除的文件
spec.exclude_files = "Classes/Exclude" 
 spec.ios.deployment_target = "5.0"  //iOS系統(tǒng)支持的最低版本號(hào)

 spec.osx.deployment_target = "10.7"  //osx系統(tǒng)支持的最低版本號(hào)

 spec.watchos.deployment_target = "2.0"  //watch系統(tǒng)支持的最低版本號(hào)

 spec.tvos.deployment_target = "9.0"  //tvOS系統(tǒng)支持的最低版本號(hào)

7.本地測(cè)試podspec文件

  • 7.1cd到.podspec文件目錄

  • 7.2 進(jìn)行本地和遠(yuǎn)程校驗(yàn)

//本地校驗(yàn)pod創(chuàng)建是否正常,該命令會(huì)根據(jù)podspec去編譯生成靜態(tài)庫(kù),檢查是否能編譯通過。
//所謂的本地校驗(yàn)是編譯本地podspec所在目錄的源碼,而不是從podspec中source所指定的云端庫(kù)地址源碼去編譯。
pod lib lint
//從podspec中source所指定的云端庫(kù)地址源碼
pod spec lint 

Lint校驗(yàn)常用參數(shù):
—sources :編譯時(shí)指定的源碼地址。例如:pod lib lint —source https://github.com/xkftkffz/HYJTestCocoapodsDemo
—user-libraries:編譯時(shí)加載依賴庫(kù)的其他靜態(tài)庫(kù)
—allow-warnings:編譯時(shí)運(yùn)行有警告。因?yàn)橛芯娴脑捑幾g也不會(huì)過。
—verbose:顯示編譯詳細(xì)信息

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

可能會(huì)用到的命令
pod cache list:查看pod緩存執(zhí)行
pod cache clean —all:清除所有緩存
pod repo update HYJTestCocoapodsDemo:指定更新HYJTestCocoapodsDemo的庫(kù)源
pod repo remove HYJTestCocoapodsDemo 可以將該倉(cāng)庫(kù)從本地cocoapods中移除
Ps:要先提交git庫(kù)的代碼到git上,在提交代碼之前,需要保證.spec中的version與即將打的tag一致,然后在git上打tag,在更新本地的庫(kù)源。最后在校驗(yàn).spec。不然很容易報(bào)錯(cuò)或者提交錯(cuò)誤文件內(nèi)容。

8.向spec repo提交podspec

//打開終端,cd到.podspec文件目錄
pod repo push [pod repo 工程名] xxx.podspec --verbose --allow-warnings
//因?yàn)榇蠖鄶?shù)都沒有l(wèi)icense許可證,都以一般都需要--allow-warnings來忽略警告,不然無法提交上去。

三、pod庫(kù)使用

1.創(chuàng)建Podfile文件

  • 1.1打開終端,輸入一下命令

//進(jìn)入你的工程目錄,與工程的xcodeproj或者xcworkspace同級(jí)目錄
cd /Users/xieyujia/Desktop/heyujia的gitHub/HYJTreeNodeDemo 

//創(chuàng)建Podfile文件
touch Podfile

2.查找你需要使用的第三方庫(kù)

可以在http://cocoapods.org 中搜索對(duì)應(yīng)的庫(kù),也可以直接在第三方庫(kù)的git網(wǎng)址里找。確定你需要使用的第三方庫(kù)pod名稱和版本。

3.編輯Podfile文件(ruby語法寫)
詳細(xì)的Podfile語法可以查看這篇文章

//platform參數(shù)是標(biāo)識(shí)應(yīng)建立的靜態(tài)庫(kù)是什么平臺(tái),ios, ‘8.0’表示該工程是iOS系統(tǒng)項(xiàng)目,最低支持8.0版本。
//對(duì)于OS X可以是:osx,對(duì)于iOS可以是:ios,對(duì)于tvOS是:tvos,或者對(duì)于watchOS是:watchos。
platform :ios, '8.0' 
//install! 這個(gè)命令是cocoapods聲明的一個(gè)安裝命令,用于安裝引入Podfile里面的依賴庫(kù)

 install! 'cocoapods', //第一個(gè)參數(shù)是安裝方法,剩下的參數(shù)是選擇項(xiàng),現(xiàn)在安裝方法只支持’cocoapods’

 :deterministic_uuids => false, //在創(chuàng)建Pods項(xiàng)目時(shí)是否生成確定性u(píng)uid,該選項(xiàng)默認(rèn)為true。如果項(xiàng)目中有重復(fù)的文件名可以設(shè)置為false來忽略。

 :integrate_targets => false //是否將安裝的pods集成到用戶項(xiàng)目中,如果設(shè)置為false, Pods將被下載并安裝到Pods/目錄中,但是它們不會(huì)集成到你的項(xiàng)目中。該選項(xiàng)默認(rèn)為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。該操作符基于你在版本需求中指定的最后一個(gè)組件工作。這個(gè)例子等于>= 0.1.2與< 0.2.0相結(jié)合,并且總是匹配與你的需求相匹配的最新已知版本。

~ > 0.1.3-beta.0,Beta版和release發(fā)行版本為0.1.3,發(fā)行版本為0.2(不包括0.2)。用破折號(hào)(-)分隔的組件將不考慮版本要求。

*/

 pod 'AFNetworking', '~> 2.0’  //AFNetworking是第三方庫(kù)pod名稱

 pod 'Masonry'  //不指定版本號(hào),則默認(rèn)下載最新的
/*

target:定義給定塊中定義的CocoaPods target和范圍依賴項(xiàng)。target應(yīng)該與Xcode target相對(duì)應(yīng)。
默認(rèn)情況下,target包含定義在塊外部的依賴項(xiàng),除非指示不要繼承inherit!他們。target指定的名稱應(yīng)于項(xiàng)目target一致。

*/

target 'HYJTreeNodeDemo' do //這個(gè)target塊開始

    target :TestCocoaPodsTests do//target開始

       inherit! :search_paths  //設(shè)置當(dāng)前目標(biāo)的繼承模式??捎媚J?+:complete 目標(biāo)繼承父模式的所有行為。目標(biāo)不會(huì)從父類繼承任何行為。目標(biāo)只繼承父類的搜索路徑。

     end//TestCocoaPodsTests的target塊結(jié)束

 //指定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這個(gè)target塊結(jié)束

4.導(dǎo)入第三方庫(kù)

//進(jìn)入你的工程目錄,與工程的xcodeproj或者xcworkspace同級(jí)目錄,Podfile文件所在的目錄

pod install  //根據(jù)Podfile文件內(nèi)容 安裝cocoapods 。pod install命令來安裝新的pod,每次在Podfile中新增和刪除pod都使用pod install命令。pod update命令僅用在更新指定pod到指定版本或者更新所有pod。

補(bǔ)充說明:
如果使用自己的私有庫(kù),需要在Pidfile中添加 source
如果指定了source則會(huì)在指定地址去下載,如果指定地址沒有,則還是會(huì)去git中下載。如果指定了path,則不會(huì)去source去下載,而是直接在path指定的路徑下載。

Podfile.lock記錄了需要被安裝的第三方庫(kù)已安裝的版本。如果你想知道具體使用的哪一個(gè)版本的,可以查看這個(gè)文件。

后期會(huì)補(bǔ)充復(fù)雜情況下Podfile的編寫,android 的maven與cocoapods的對(duì)比. 項(xiàng)目目錄結(jié)構(gòu)復(fù)雜或者使用靜態(tài)庫(kù)的情況下,.podspec該如何編寫,代碼應(yīng)該如何解耦才能更方便的使用.podspec。

參考:

CocoaPods 都做了什么?

CocoaPods使用總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容