CocoaPods使用小結

FelixPlus發表於2019-04-01

原文連結

CocoaPods是OS X和iOS下的一個第三類庫管理工具,通過CocoaPods工具我們可以為專案新增被稱為“Pods”的依賴庫(這些類庫必須是CocoaPods本身所支援的),並且可以輕鬆管理其版本。

使用CocoaPods有以下幾點好處:

  • 在引入第三方庫時它可以自動為我們完成各種各樣的配置,包括配置編譯階段、聯結器選項、甚至是ARC環境下的一些配置等。
  • 使用CocoaPods可以很方便地管理的第三方SDK,大部分穩定好用的SDK都支援cocoapods匯入。
  • 在專案模組化的過程中方便我們模組間解耦。

Install


sudo gem install cocoapods
複製程式碼

檢視版本


pod --version
複製程式碼

在開發中安裝使用cocoapods要注意版本,因為一般開發過程中要大家一起使用同一個工程,一般為了指定版本我們會在工程下建立Gemfile來指定使用cocoapods的版本。

指定使用Cocoapods的版本


除了指定Gemfile以外 , 我們還可以安裝指定版本的pods

sudo gem install cocoapods -v 1.3.1
複製程式碼

再檢視一下pod版本我們就會發現已經安裝了1.3.1

解除安裝掉不需要的版本


當我們本地同時存在多個版本的pod的時候可以把多餘的解除安裝掉

sudo gem uninstall cocoapods
複製程式碼

會提示我們選擇解除安裝的版本

Select gem to uninstall:
 1. cocoapods-1.2.1
 2. cocoapods-1.3.1
 3. All versions
>
複製程式碼

我們選擇想要解除安裝的版本的序號就好了 。

如何檢視某個SDK的詳細資訊


cocoapods支援我們去查詢想要使用的倉庫 , 比如我們想查詢ReactoveObjC這個庫

pod spec cat ReactiveObjC
複製程式碼

我們可以看到該倉庫的配置資訊。

{
  "name": "ReactiveObjC",
  "version": "3.1.0",
  "summary": "The 2.x ReactiveCocoa Objective-C API: Streams of values over time",
  "description": "ReactiveObjC (formally ReactiveCocoa or RAC) is an Objective-C\nframework inspired by [Functional Reactive Programming](\nhttp://en.wikipedia.org/wiki/Functional_reactive_programming).\nIt provides APIs for composing and **transforming streams of values**.",
  "homepage": "https://reactivecocoa.io",
  "screenshots": "https://reactivecocoa.io/img/logo.png",
  "license": {
    "type": "MIT",
    "file": "LICENSE.md"
  },
  "documentation_url": "https://github.com/ReactiveCocoa/ReactiveObjC/tree/master/Documentation#readme",
  "authors": "ReactiveCocoa",
  "social_media_url": "https://twitter.com/ReactiveCocoa",
  "platforms": {
    "ios": "8.0",
    "osx": "10.9",
    "watchos": "2.0",
    "tvos": "9.0"
  },
  "source": {
    "git": "https://github.com/ReactiveCocoa/ReactiveObjC.git",
    "tag": "3.1.0"
  },
  "source_files": [
    "ReactiveObjC/*.{h,m,d}",
    "ReactiveObjC/extobjc/*.{h,m}"
  ],
  "private_header_files": [
    "**/*Private.h",
    "**/*EXTRuntimeExtensions.h",
    "**/RACEmpty*.h"
  ],
  "ios": {
    "exclude_files": "ReactiveObjC/**/*{AppKit,NSControl,NSText,NSTable}*"
  },
  "osx": {
    "exclude_files": "ReactiveObjC/**/*{UIActionSheet,UIAlertView,UIBarButtonItem,UIButton,UICollectionReusableView,UIControl,UIDatePicker,UIGestureRecognizer,UIImagePicker,UIRefreshControl,UISegmentedControl,UISlider,UIStepper,UISwitch,UITableViewCell,UITableViewHeaderFooterView,UIText,MK}*"
  },
  "tvos": {
    "exclude_files": "ReactiveObjC/**/*{AppKit,NSControl,NSText,NSTable,UIActionSheet,UIAlertView,UIDatePicker,UIImagePicker,UIRefreshControl,UISlider,UIStepper,UISwitch,MK}*"
  },
  "watchos": {
    "exclude_files": "ReactiveObjC/**/*{UIActionSheet,UIAlertView,UIBarButtonItem,UIButton,UICollectionReusableView,UIControl,UIDatePicker,UIGestureRecognizer,UIImagePicker,UIRefreshControl,UISegmentedControl,UISlider,UIStepper,UISwitch,UITableViewCell,UITableViewHeaderFooterView,UIText,MK,AppKit,NSControl,NSText,NSTable,NSURLConnection}*"
複製程式碼

開始使用

首先 , 新建一個singlgViewApp ,然後在命令列進入該project目錄

pod init
複製程式碼

我們可以看到cocoapods為我們生成了一個Podfile platform表示這個工程安裝的裝置,後面是系統最低版本 現在我們可以在裡面新增一下剛才搜尋的倉庫

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'ocTest' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!
  pod 'ReactiveObjC'
  # Pods for ocTest
end
複製程式碼

這裡我們新增了一個倉庫,接下來再命令列執行pod update來安裝所需要的倉庫,安裝完畢後我們可以看到當前路徑下有兩個工程檔案

  • Test.xcodeproj
  • Test.xcworkspace

我們在使用了cocoapods管理第三方庫的時候,每次install或者update的時候就會生成*.xcworkspace這個檔案我們需要使用這個工程進行開發除錯。 現在開啟工程,定位到viewController.m中就可以import並使用ReactiveObjC啦 。

如何使用私有源


公司內部有自己搭建的gitlab服務時,有的公司搭建的gitlab服務為了安全並沒有提供外網介面,我們只能在內網訪問,這時候就要在podfile中新增私有源的地址

source 'http://xx.xxxx.com/ios/cocoapods-spec.git'
source 'https://github.com/CocoaPods/Specs.git'  # 官方庫
複製程式碼

上面那個就是我們要新增的私有源地址,下面的是官方源地址,如果都不寫的話那麼預設就會使用官方源 。

如何建立併發布倉庫到私有repo


  • 首先執行命令,後面替換為你要釋出SDK的名字
pod lib create TDFCommonUtil
複製程式碼

  • pod會給出一些選項讓我們選擇
To get you started we need to ask a few questions, this should only take a minute.

If this is your first time we recommend running through with the guide:
 - https://guides.cocoapods.org/making/using-pod-lib-create.html
 ( hold cmd and click links to open in a browser. )


What platform do you want to use?? [ iOS / macOS ]
 >
ios
What language do you want to use?? [ Swift / ObjC ]
 >
swift
Would you like to include a demo application with your library? [ Yes / No ]
 >
yes
Which testing frameworks will you use? [ Quick / None ]
 > None

Would you like to do view based testing? [ Yes / No ]
 > NO
複製程式碼
  • 現在我們需要新增一些資訊

cd進入剛才建立的目錄,執行命令 ls 可以看到控制檯有以下輸出。

Example               README.md           TDFCommonUtil.podspec
LICENSE               TDFCommonUtil         _Pods.xcodeproj
複製程式碼

解釋一下這裡都是啥

  • Example 這裡面就是示例工程
  • README.md 這裡面是我們對改pod功能和使用等的介紹 , 使用markdown語法
  • TDFCommonUtil.podspec 這裡是改模組的全部基本資訊
  • LICENSE 這裡放的是改開源專案遵守的協議
  • TDFCommonUtil 這裡放著全部的類檔案和資原始檔
  • _Pods.xcodeproj 這是示例工程的快捷方式

我們首先要為我們的pod建立一個實際的git倉庫 。

開啟gitlab服務建立一個空的git倉庫 然後先把pod目錄提交到我們的倉庫 blalblabla

開啟TDFCommonUtil.podspec檔案

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



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

  s.homepage         = 'https://github.com/xxxxx@yeah.net/TDFCommonUtil'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'xxxxx' => 'xxxxx@2dfire.com' }
  s.source           = { :git => 'https://github.com/xxxxx@yeah.net/TDFCommonUtil.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'

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

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

這裡的配置項就是生成pod需要配置的大部分選項了 ,簡單介紹一下

  • name pod名稱
  • version 版本號 ,特別注意下在更新時需要對git倉庫打tag
  • summary 簡介
  • description 描述
  • homepage 主頁
  • license 使用協議
  • author 作者
  • deployment_target 需要系統版本
  • source_files 原始檔路徑
  • resource_bundles 資原始檔路徑 注意這裡會把資原始檔打包成bundle , 呼叫的時候要注意下
  • public_header_files 公開的標頭檔案 (有些標頭檔案我們不想要外部看見可以在這裡去掉)
  • frameworks 需要依賴的framework庫
  • dependency 需要依賴的其他pod

現在把這些填好吧 。

如何新增依賴


有的時候我們開發的pod倉庫需要依賴其他倉庫,比如我們需要依賴ReactiveObjC 這裡就可以在TDFCommonUtil.podspec下面新增這一行

s.dependency 'ReactiveObjC'
複製程式碼

ps ,這裡可以指向特定的版本也可以用 '~> 2.3' 的形式表示依賴此倉庫至少大於2.3版本但是不會超過3.0 。

使用lint命令檢測我們的倉庫是否還有問題


一切就緒後你可以在裡面建立你的檔案,新增程式碼了,別忘了再有檔案的增加或刪除後在執行一遍 ‘pod install’。

先隨便建立幾個檔案,然後我們使用cocoapods檢測我們的庫

pod lib lint --sources='git@git.xxx.com:ios/cocoapods-spec.git' --use-libraries --allow-warnings --verbose --no-clean
複製程式碼

這裡的sources填寫你所使用的私有gitlab服務,然後我們就可以靜靜的看著命令列了。

最後如果出現

Test passed validation.
複製程式碼

證明你的庫是可執行的,如果沒有出現passed就注意下輸出中的error資訊,搜尋一下error看是什麼導致的 。

向私有源推送


lint通過後我們就可以把自己的倉庫資訊推送到私有源了,注意不是「倉庫」是「倉庫資訊」,也就是x.podspec 。 cocoapod可以自動幫我們完成這件事情

pod repo push xxx-cocoapods-spec TDFOpenShopSDK.podspec --sources=git@git.xxx.com:ios/cocoapods-spec.git --allow-warnings --use-libraries --verbose
複製程式碼

總結


Cocoapods極大方便了我們管理外部SDK和內部模組化解耦,用好這個管理工具無疑會為我們的工作效率帶來巨大提升。

相關文章