iOS 必備工具 - CocoaPods

第一部分:CocoaPods 的使用


需求

在 iOS 開發(fā)過程中,當(dāng)你需要使用必要的三方庫時(shí)沃饶,是否被各種庫搞得筋疲力盡酥夭?
當(dāng)你需要使用三方庫時(shí),你不僅需要手動(dòng)下載庫搅轿,還需要為該庫添加可能依賴的系統(tǒng)庫病涨;在庫需要更新時(shí),你依然需要重復(fù)上述操作璧坟,并且當(dāng)你想要?jiǎng)h除一些不再需要的三方庫時(shí)既穆,你還需要連同依賴的系統(tǒng)一并刪除,刪除的過程中特別注意其他庫所依賴的部分雀鹃』霉ぃ總之,手動(dòng)管理庫的過程相當(dāng)?shù)姆爆嵍秩菀壮鲥e(cuò)黎茎。那么囊颅,有沒有相關(guān)的工具幫我們完成這些繁瑣的是呢?這就要提到 iOS 程序員需要掌握的必備工具 - CoCoaPods。無論你是新手還是老手踢代,這工具都是接下來經(jīng)常打交道的盲憎,所以,這里推薦新手們快速的掌握該工具的使用胳挎,因?yàn)樗軒湍闶∪ハ喈?dāng)多的麻煩饼疙。

CocoaPods簡介

CocoaPods 是庫管理工具,iOS 開發(fā)過程中會(huì)遇到兩個(gè)頭疼的問題 -- 依賴庫的重復(fù)性和三方庫的更新串远,使用 CocoaPods 管理工具幫你自動(dòng)完成上述工作宏多,而你所需要做的事情就是編寫一份文件,來指定需要的三方庫以及版本等信息澡罚,然后一句更新命令即可。另外絕大部分有名的開源庫肾请,都支持了 CocoaPods留搔,這也讓 iOS 開發(fā)人員避不開使用 CocoPods。當(dāng)然你也可以發(fā)布自己的庫到 CocoaPods 上铛铁,分享你的工具隔显。

想要了解更多的信息,可以查閱 官方指導(dǎo)文檔 饵逐。

安裝 CocoaPods

安裝 CocoaPods 需要 Ruby 環(huán)境括眠,幸運(yùn)的是,OS X 系統(tǒng)默認(rèn)安裝了 Ruby 環(huán)境倍权,你可以使用下面的命令來查看當(dāng)前的 Ruby 版本掷豺。

$ ruby -v 

CocoaPods 要求 Ruby 一定版本的,一般大于 2.2.0 即可薄声,如果還不行当船,選擇更高的版本即可。如果你的 Mac 達(dá)到了要求默辨,那么使用下面的命令安裝即可德频。

$ gem install cocoapods

如果你的賬號(hào)在電腦上沒有權(quán)限,使用下面命令缩幸,并輸入電腦的密碼壹置。

$ sudo gem install cocoapods

如果順利安裝完成,執(zhí)行以下命令來進(jìn)行初始化表谊,它會(huì)下載服務(wù)器中所有的框架信息钞护,緩存到電腦本地。過程可能需要較長時(shí)間铃肯。

$ pod setup

如果順利患亿,你就可以跳到使用 CocoaPods 使用步驟。

安裝過程中可能出現(xiàn)的問題

  • 執(zhí)行 gem install cocoapods 沒反應(yīng)

因?yàn)?Ruby 默認(rèn)的來源是 https://rubygems.org/ , 國內(nèi)訪問時(shí)如果沒有梯子時(shí)會(huì)非常困難,可以將源替換為國內(nèi)的鏡像服務(wù)器步藕。

執(zhí)行下面命令查看當(dāng)前使用的源惦界。

$ gem sources -l

將源替換為國內(nèi)鏡像服務(wù)器的源。先刪除再添加咙冗。

$ gem sources --remove https://rubygems.org/
$ gem sources -a https://gems.ruby-china.com/
  • Ruby 版本過低

當(dāng)出現(xiàn)提示 active support requires Ruby version >=2.2.0 字樣時(shí)沾歪,你需要將電腦上 Ruby 環(huán)境的版本升級(jí)到 2.2 以上。關(guān)于升級(jí) Ruby雾消,你可以使用 RVM(Ruby Version Manager灾搏,Ruby版本管理器)。

$ curl -L get.rvm.io | bash -s stable
$ source ~/.bashrc
$ source ~/.bash_profile

升級(jí) Ruby

列出當(dāng)前可以使用的各個(gè)版本信息立润。

$ rvm list known rubies

安裝對(duì)應(yīng)的版本

$ rvm install x.x.x

更多的問題狂窑,請(qǐng)自行搜索網(wǎng)絡(luò)最新文章。

使用 CocoaPods 管理三方庫

我們先新建一個(gè)演示工程:cocoapodsDemo桑腮。

在終端使用 cd 命令進(jìn)入到該項(xiàng)目下泉哈,執(zhí)行下面命令來創(chuàng)建三方庫的配置文件 Podfile。你也可以手動(dòng)創(chuàng)建破讨,但是名稱必須為 Podfile丛晦。

$ pod init

使用 vim Podfile 命令進(jìn)入該文件,或者直接在項(xiàng)目結(jié)構(gòu)中查看提陶。

項(xiàng)目結(jié)構(gòu)中的Podfile文件

編輯 Podfile 文件烫沙,以 AFNetworkingJSONKit隙笆,Reachability為例锌蓄,編輯后的內(nèi)容如下:
編輯Podfile文件

Podfile更多的語法

編輯完成保存并退出仲器,終端進(jìn)入到該項(xiàng)目目錄下煤率,使用下述命令完成三方庫的安裝。

進(jìn)入到項(xiàng)目目錄乏冀。

 $ cd desktop/cocoapodsDemo

執(zhí)行 CocoaPods 安裝命令蝶糯。

$ pod install

出現(xiàn)以下提示,表示成功安裝辆沦。

成功安裝三方庫

注意昼捍,安裝完成之后,當(dāng)前項(xiàng)目 Project 不能正常運(yùn)行了肢扯,我們需要使用 CocoaPods 為我們創(chuàng)建的 workspace 來運(yùn)行項(xiàng)目妒茬。我們重新打開項(xiàng)目目錄。
安裝后的目錄

對(duì)比最初的目錄結(jié)構(gòu)蔚晨,這里已經(jīng)多出了四個(gè)文件乍钻,其中:

  • Podfile 是三方庫的配置文件
  • xxx.xcworkspace 是管理我們項(xiàng)目和所有依賴庫的 workspace
  • Podfile.lock 是執(zhí)行安裝后的信息
  • Pods 存放了三方庫文件以及系統(tǒng)依賴庫

我們打開這里的 xxx.xcworkspace肛循。項(xiàng)目結(jié)構(gòu)如下:

workspace的目錄結(jié)構(gòu)

以后你就可以通過 xxx.xcworkspace 來運(yùn)行你的項(xiàng)目了,其他關(guān)于三方庫的部分都交給 CocoaPods 來管理吧银择。

Cocoapods 幫你做了什么呢多糠?

打開 cocoapodsDemo 項(xiàng)目的 Frameworks ,你可以找到一個(gè) libPods-xxx.a 文件浩考。

編譯的 .a 文件

CocoaPods 通過文件 Podfile 中的三方庫信息下載你所需要的庫夹孔,并將這些庫編譯成一個(gè) .a 的靜態(tài)庫鏈接到你的項(xiàng)目,除此之外析孽,CocoaPods 幫你完成依賴庫的管理搭伤,它能夠去除三方庫的依賴庫的重復(fù)庫,在你刪除不需要的三方庫是袜瞬,同樣自動(dòng)刪除多余的依賴庫怜俐。

CocoaPods 將所有的第三方庫以 target 的方式組成一個(gè)名為Pods的工程里,我們的工程和第三方庫所在的工程 Pods 由一個(gè)新生成的 workspace 管理吞滞。

workspace的組成

更多常用的 pod 命令

  • 新增或刪除三方庫

Podfile 新增或刪除指定三方庫的配置信息佑菩。重新執(zhí)行下面命令。

$ pod install
  • 搜索三方庫的信息

你可以使用 search 搜索一些三方庫的信息裁赠,你無需全匹配,模糊搜索即可赴精。

$ pod search AFNetworking
$ pod search SDWeb

注:search 命令只會(huì)使用本地所創(chuàng)建的索引進(jìn)行搜索佩捞,因此,你搜索到的最新庫可能并不是最新版本蕾哟。

  • 更新框架 / 更新本地索引文件

當(dāng)你的 Podfile 文件中沒有為三方庫指定特定版本一忱,但后續(xù)又想將三方庫更新到最新,你可以使用 update 命令來更新本地索引并完成類似 install 的安裝效果谭确。

# 同步遠(yuǎn)程最新信息
$ pod update
# 只根據(jù)本地緩存更新到最新的版本
$ pod update --no-repo-update
  • 更新指定庫

有時(shí)候你可能并不需要更新所有的三方庫帘营,這種情況經(jīng)常出現(xiàn),例如你的 Podfile 文件中只有部分庫指定了版本逐哈,你這時(shí)候使用 update 命令芬迄,默認(rèn)是會(huì)將所有未指定的三方庫都進(jìn)行了更新笆凌,如果三方庫出現(xiàn) api 更新或替換芳撒,你的項(xiàng)目將出現(xiàn)錯(cuò)誤問題。又或者你的網(wǎng)絡(luò)不穩(wěn)定利耍,你只想更新一個(gè)或指定的幾個(gè)庫肠骆,你需要下面的命令來進(jìn)行指定庫的更新算途。

$ pod update 三方庫  --verbose --no-repo-update
  • 本地索引庫在哪里?

通過 shift + command + G 打開前往文件夾蚀腿,輸入

~/.cocoapods/repos/

找到 master/specs 文件夾嘴瓤,該文件夾下緩存了 CocoaPods 的所有的三方庫信息,有三層文件夾,分別是 0-f 廓脆,隨便點(diǎn)開某個(gè)三方庫的索引文件筛谚,你可以在這里看到該三方庫的歷史版本。

某個(gè)庫的索引文件

其中狞贱,文件 xxxx.podspec.json 中就是三方庫的更詳細(xì)的信息刻获,例如作者,當(dāng)前版本瞎嬉,介紹蝎毡,目錄結(jié)構(gòu),依賴庫等等氧枣。

xxx.podspec.json

由于 CocoaPods 在時(shí)刻更新沐兵,所以你的緩存并非最新,所以你可能需要更新本地的 repos 便监。使用下面命令來更新扎谎。

$ pod repo update

該命令會(huì)同步所有庫的最新本版信息,如果你只想關(guān)心指定的庫烧董,你可以使用下面命令毁靶。

pod repo update ~/.cocoapods/repos/***/庫名

如果指定更新依舊無法更新,但是你急需使用最新的庫逊移,你可以去官網(wǎng)git手動(dòng)去下載對(duì)應(yīng)的庫预吆,也可以從有的同事小伙伴那邊直接復(fù)制。

  • 更多相關(guān)的命令

cocoapods的命令資料胳泉。


第二部分:讓自己的庫支持 CocoaPods

需求

我們想要將自己開發(fā)的工具組件給他人使用拐叉,通常將共享文件封裝成 framework,讓別人手動(dòng)導(dǎo)入到自己的項(xiàng)目中去扇商,這也是開放平臺(tái)的通常做法凤瘦。除此之外,我們還可以通過 Cocoapods 來分享自己的工具組件案铺,就像 AFNetworking蔬芥、SDWebImage 一樣。

必要條件

  1. 項(xiàng)目代碼庫(如 git红且、碼云等)并發(fā)布了release坝茎。
  2. podspec 配置文件
  3. cocoapods 賬號(hào)

如果你已經(jīng)有了 Git 倉庫,你只需要在項(xiàng)目中創(chuàng)建并配置你的項(xiàng)目信息即可暇番,文件名為 yourProjectName.podspec 嗤放。該文件語法可以看 官網(wǎng)指導(dǎo)

其他部分你可以參考這篇文章 iOS 讓自己的框架支持cocoapods壁酬。

接下來的篇幅次酌,主要介紹的是從無到有的過程恨课,這部分的內(nèi)容節(jié)選自 iOS 組件化 中的內(nèi)容。關(guān)于組件化你可以通過上面的鏈接來了解更多岳服。

我們來創(chuàng)建一個(gè)關(guān)于網(wǎng)絡(luò)請(qǐng)求的功能組件 LLNetworking剂公。

  • 拉取模版

我們將創(chuàng)建在桌面上的一個(gè)名為 Demo 文件夾。通過終端進(jìn)入到該文件夾下吊宋,然后輸入命令:

$ pod lib create LLNetworking

這個(gè)命令會(huì)為了拉取 Pod 的 基礎(chǔ)模板纲辽。拉取之后,還會(huì)通過詢問的形式為你配置一些東西:

// 作用的平臺(tái)
What platform do you want to use?? [ iOS / macOS ]
 > iOS

// 語言環(huán)境
What language do you want to use?? [ Swift / ObjC ]
 > ObjC

// 是否需要一個(gè) demo 用來測試組件
Would you like to include a demo application with your library? [ Yes / No ]
 > Yes

Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None

Would you like to do view based testing? [ Yes / No ]
 > Yes

// 組件中璃搜,文件的前綴
What is your class prefix?
 > LL

確認(rèn)之后拖吼,系統(tǒng)會(huì)為你自動(dòng)配置項(xiàng)目,創(chuàng)建好的項(xiàng)目如下:

LLNetworking
  • Example 工程

項(xiàng)目文件目錄中存在一個(gè)名為 Example 的工程这吻,這個(gè)工程是你選擇 Would you like to include a demo application with your library? 中選擇 Yes 時(shí)為你添加的吊档,這個(gè)還是很有用的,在你開發(fā)過程中可以通過它來集成測試組件功能的正確性唾糯、完整性怠硼。 我們先打開這個(gè) Example 來看下:

項(xiàng)目結(jié)構(gòu)

這個(gè) Example 已經(jīng)為你的組件創(chuàng)建了索引文件 podspec,并且集成了該組件移怯。我們來看下 ExamplePodfile 的內(nèi)容:

use_frameworks!

platform :ios, '8.0'

target 'LLNetworking_Example' do
  pod 'LLNetworking', :path => '../'

  target 'LLNetworking_Tests' do
    inherit! :search_paths

    pod 'FBSnapshotTestCase'
  end
end

其中為你集成了一個(gè)測試用例 pod 'FBSnapshotTestCase'香璃,目前可以忽略。

我們可以看到: pod 'LLNetworking', :path => '../' 這一句舟误,path 路徑指向了本地路徑增显,對(duì)應(yīng) LLNetworking 主目錄下:

組件目錄

這個(gè)文件夾下,一個(gè)存放你的各種類文件脐帝,一個(gè)存放圖片資源等。

  • podspec 文件

在你回答之前問題之后糖权,pod 為你自動(dòng)創(chuàng)建了該文件堵腹,并執(zhí)行了 pod install 命令,該命令會(huì)找到組件的索引文件(也在本地) LLNetworking.podspec

#
# Be sure to run `pod lib lint LLNetworking.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'LLNetworking'
  s.version          = '0.1.0'
  s.summary          = 'A short description of LLNetworking.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/LOLITA0164/LLNetworking'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'LOLITA0164' => '476512340@qq.com' }
  s.source           = { :git => 'https://github.com/LOLITA0164/LLNetworking.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.source_files = 'LLNetworking/Classes/**/*'
  
  # s.resource_bundles = {
  #   'LLNetworking' => ['LLNetworking/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end

該文件為你的組件自動(dòng)配置了一些基本的信息星澳,因?yàn)槲抑笆褂眠^ trunk 登陸過疚顷,所以這里有的的賬號(hào)信息。當(dāng)然這些信息是需要你根據(jù)情況修改的禁偎,更多的配置你可以搜索相關(guān)文檔腿堤。

注意:這里的 Git 地址目前是找不到的,后期需要自己關(guān)聯(lián)如暖。

設(shè)置共享文件

podspec 文件中 s.source_files = 'LLNetworking/Classes/**/*' 指代共享的資源路徑笆檀,我們需要將共享的文件放到這里來。

共享文件夾

我們打開組件的目錄查看盒至,可以看到這里已經(jīng)有了名為 ReplaceMe 的文件了酗洒,這暗示你用共享文件替換它士修。

podspec 文件中還有一個(gè)被注釋掉的:

# s.resource_bundles = {
  #   'LLNetworking' => ['LLNetworking/Assets/*.png']
  # }

這個(gè)目錄中存放一些圖片等資源,當(dāng)你需要的時(shí)候可以開啟來樱衷。

我們來創(chuàng)建一個(gè) LLNetworking 類:

@interface LLNetworking : NSObject
-(NSString*)getSomething;
@end

@implementation LLNetworking
-(NSString *)getSomething{
    return @"test method.";
}
@end

將其移動(dòng)到組件的共享目錄下并刪除掉空文件ReplaceMe

設(shè)置共享文件

這樣棋嘲,我們就設(shè)置好了共享的內(nèi)容,即組件開發(fā)好了矩桂。接下來沸移,我們使用 Example 工程來使用這個(gè)組件的內(nèi)容。

終端進(jìn)入 Example 工程目錄下侄榴,執(zhí)行 pod install 命令來安裝組件雹锣。

安裝新的組件

我們發(fā)現(xiàn),Example 項(xiàng)目中 Pods/Development Pods/LLNetworking 下牲蜀,多出來最新添加的文件笆制。

使用組件

我們安裝好組件之后來使用一下組件的功能,就像使用三方庫那樣:

#import <LLNetworking/LLNetworking.h>

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    LLNetworking * networking = LLNetworking.new;
    NSLog(@"%@",networking.getSomething);
}

控制臺(tái)輸出:

2019-11-08 17:14:47.455341+0800 LLNetworking_Example[7038:1682304] test method.

這表示功能正常涣达。

在組件開發(fā)過程中在辆,使用 pod 'LLNetworking', :path => '../' 將路徑指向本地是很有必要的,方便測試你的組件配置是否正確度苔,功能是否完善匆篓,相比推到遠(yuǎn)程、發(fā)布再集成寇窑,這方便太多了鸦概。

三方依賴庫

有時(shí)候,我們的組件還依賴其他的組件甩骏,又或者是三方庫窗市。我們通過 s.dependency 字段去設(shè)置,多個(gè)庫可以分開寫多次饮笛。

Podfiles 模版里最后一條已經(jīng)為我們添加好了咨察,所依賴的是 AFNetworking ,正好是我們網(wǎng)絡(luò)請(qǐng)求組件所依賴的福青,我們把它開啟摄狱,重新 pod install

Analyzing dependencies
Fetching podspec for `LLNetworking` from `../`
Downloading dependencies
Installing AFNetworking (2.7.0)
……

我們發(fā)現(xiàn),Example 自動(dòng)拉取了組件 LLNetworking 所依賴的其他組件无午。CocoaPods 工具的另外一個(gè)優(yōu)點(diǎn)就是媒役,多個(gè)組件依賴同一個(gè)組件時(shí),它會(huì)自動(dòng)幫你檢測安裝宪迟,而不會(huì)重復(fù)導(dǎo)入酣衷。

本地組件和遠(yuǎn)程組件

我們發(fā)現(xiàn) Example 工程的 Pods中,本地開發(fā)的組件和遠(yuǎn)程發(fā)布的組件被分別放在了不同的目錄下踩验。

有了 AFNetworking 之后鸥诽,你就可以修改你的網(wǎng)絡(luò)請(qǐng)求組件了:

#import <AFNetworking/AFNetworking.h>
@interface LLNetworking : NSObject
@property(strong,nonatomic)NSURLSessionDataTask *task;
- (NSURLSessionDataTask *)POSTWithURLString:(NSString *)URLString parameters:(id)parameters success:(void (^)(id responseObject))success failure:(void (^)(id error))failure;
@end

@implementation LLNetworking
- (NSURLSessionDataTask *)POSTWithURLString:(NSString *)URLString parameters:(id)parameters success:(void (^)(id responseObject))success failure:(void (^)(id error))failure{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.requestSerializer.timeoutInterval = 20;
   _task =  [manager POST:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
       if (success) {
           success(@{@"status":@"success"});
       }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(@{@"status":@"failure"});
        }
    }];
    return _task;
}
@end

修改好之后商玫,還不能直接在 Example 中使用,需要卸載組件再重新安裝牡借。注釋掉 pod 'LLNetworking', :path => '../' 之后執(zhí)行 pod install 即可完成卸載拳昌。

至此,你完成了組件的創(chuàng)建钠龙、文件共享炬藤、本地化測試使用和更新。但是碴里,我們的組件畢竟是要服務(wù)于宿主工程的沈矿,如果僅僅只能是通過本地集成,那意義不大咬腋,我們要將其關(guān)聯(lián)到遠(yuǎn)程服務(wù)器羹膳,推送到本地搭建的 GitLab,又或者是 GitHub根竿、碼云陵像、Coding 等平臺(tái)。

關(guān)聯(lián)遠(yuǎn)程倉庫

在模版 podspec 文件中寇壳,已經(jīng)幫我們指定了一個(gè) GitHub 的倉庫地址醒颖,

s.homepage         = 'https://github.com/LOLITA0164/LLNetworking'

你可以使用它或者進(jìn)行修改它。我們這里選擇使用它壳炎,先去 GitHub 創(chuàng)建對(duì)應(yīng)的倉庫泞歉。

創(chuàng)建演示demo

在最初創(chuàng)建組件時(shí),系統(tǒng)已經(jīng)幫我們創(chuàng)建好了本地 Git 倉庫匿辩,進(jìn)入到項(xiàng)目中腰耙,顯示出隱藏文件夾就可以看到(command+shift+. 顯隱):

本地git倉庫

如果沒有,你可以使用命令 git init 創(chuàng)建一個(gè)〔颍現(xiàn)在沟优,我們要將之前的修改進(jìn)行提交(本地提交)。

git commit -am "第一次提交"  

然后我們要把本地的 Git 倉庫和剛剛創(chuàng)建的遠(yuǎn)程倉庫進(jìn)行關(guān)聯(lián)睬辐。如何關(guān)聯(lián)呢?你在網(wǎng)站上創(chuàng)建項(xiàng)目后有了這樣的提示:

關(guān)聯(lián)遠(yuǎn)程倉庫

這里有三種:創(chuàng)建一個(gè)新的倉庫宾肺,推送一個(gè)已存在的倉庫以及從其他倉庫導(dǎo)入溯饵。我們這里使用第二種即可。

添加遠(yuǎn)程倉庫:

git remote add origin https://github.com/LOLITA0164/LLNetworking.git

將本地內(nèi)容推送到遠(yuǎn)程倉庫:

git push -u origin master

可能會(huì)出現(xiàn)讓你登陸驗(yàn)證锨用,輸入你的用戶名和密碼即可丰刊。出現(xiàn)以下信息即表示推送成功。

remote: Resolving deltas: 100% (49/49), done.
To https://github.com/LOLITA0164/LLNetworking.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

回到 GitHub 刷新一下即可看到你的提交記錄增拥。

上述是通過終端命令進(jìn)行 git 操作啄巧,如果你并不熟悉 git 命令寻歧,你大可以使用便捷的可視化工具(上一章節(jié)有所提及),僅需簡單的點(diǎn)擊操作即可完成項(xiàng)目的管理秩仆。

tag 并發(fā)布到 Cocoapods

打標(biāo)簽

至此码泛,我們已經(jīng)成功的將本地倉庫關(guān)聯(lián)并推送到遠(yuǎn)程倉庫,現(xiàn)在我們要發(fā)布一個(gè)可用的組件澄耍。

首先我們要給當(dāng)前項(xiàng)目打一個(gè) tag 版本號(hào)噪珊,在 podspec 中:

s.version          = '0.1.0'

指定的版本號(hào)是 0.1.0,那么我們就同樣打個(gè) 0.1.0tag:

$ git tag 0.1.0  // 打 tag
$ git push --tags  // 推送到遠(yuǎn)程

tag 默認(rèn)在當(dāng)前分支上齐莲,因?yàn)檫@里只有 master痢站,所以不用切換分支,如果后期有其他分支选酗,注意別弄錯(cuò)了阵难。

刷新頁面,項(xiàng)目的 release 選項(xiàng)中會(huì)出現(xiàn)剛剛打的版本芒填。

打tag

你也可以直接在頁面的 release 下添加新的 tag呜叫,點(diǎn)擊 release 可以看到編輯頁面:

在線打包

發(fā)布到 CocoaPods

由于我們創(chuàng)建的項(xiàng)目以及標(biāo)簽的版本號(hào)都是沿用了 podspec 文件中的信息,因此可以直接驗(yàn)證 podspec 文件信息是否可以通過驗(yàn)證氢烘,如果需要調(diào)整怀偷,調(diào)整之后最好同樣先驗(yàn)證:

pod spec lint

podspec 文件的版本號(hào)一定要和 tag 保持一致。

如果通過驗(yàn)證播玖,那么你會(huì)看到類似下面的提示椎工,綠色的 passed validation

驗(yàn)證通過

現(xiàn)在可以將 podspec 文件提交到 CocoaPods 上了:

首先要通過 trunk 注冊(cè)生成一條會(huì)話:

// pod trunk register 郵箱 用戶名 描述
pod trunk register 476512340@qq.com LOLITA0164 --description=組件化demo 

然后去郵箱進(jìn)行驗(yàn)證,驗(yàn)證成功會(huì)出現(xiàn)下面頁面:

驗(yàn)證通過

現(xiàn)在蜀踏,就可以將 podspec 提交給 CocoaPods 了维蒙。這個(gè)文件將是別人搜索你的組件的索引。

pod trunk push LLNetworking.podspec --allow-warnings

上傳完成之后果覆,接可以通過 pod search LLNetworking 搜索到自己的組件了颅痊,如果搜索不到,刪除本地的搜索文件局待,命令 :

rm ~/Library/Caches/CocoaPods/search_index.json

重新 search 產(chǎn)生新的搜索文件斑响。

發(fā)布新版本則需要打新的 tag,重新編輯 podspec 文件钳榨,然后再次提交給 CocoaPods舰罚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市薛耻,隨后出現(xiàn)的幾起案子营罢,更是在濱河造成了極大的恐慌,老刑警劉巖饼齿,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饲漾,死亡現(xiàn)場離奇詭異蝙搔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)考传,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吃型,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伙菊,你說我怎么就攤上這事败玉。” “怎么了镜硕?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵运翼,是天一觀的道長。 經(jīng)常有香客問我兴枯,道長血淌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任财剖,我火速辦了婚禮悠夯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躺坟。我一直安慰自己沦补,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布咪橙。 她就那樣靜靜地躺著夕膀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪美侦。 梳的紋絲不亂的頭發(fā)上产舞,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音菠剩,去河邊找鬼易猫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛具壮,可吹牛的內(nèi)容都是我干的准颓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼棺妓,長吁一口氣:“原來是場噩夢啊……” “哼瞬场!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涧郊,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眼五,沒想到半個(gè)月后妆艘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彤灶,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年批旺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幌陕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汽煮,死狀恐怖搏熄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暇赤,我是刑警寧澤心例,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站鞋囊,受9級(jí)特大地震影響止后,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溜腐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一译株、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挺益,春花似錦歉糜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黍檩,卻和暖如春叉袍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刽酱。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工喳逛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棵里。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓润文,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殿怜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子典蝌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容