做iOS開(kāi)發(fā)時(shí)常常會(huì)使用Cocoapods來(lái)管理第三方依賴庫(kù),指定好依賴之后,自動(dòng)下載依賴即可。
關(guān)于Cocoapods的安裝可以參考這篇文章CocoaPods安裝和使用教程。
現(xiàn)在有一個(gè)場(chǎng)景:有2個(gè)項(xiàng)目,需要提取一個(gè)出一個(gè)公共的庫(kù)提供給兩個(gè)項(xiàng)目使用,如何使用Cocoapods解決使用公共庫(kù)的問(wèn)題呢?
通過(guò)自定義一個(gè)Cocoapods的庫(kù)可以解決這個(gè)問(wèn)題,自定義一個(gè)公共Cocoapods庫(kù)的好處:可以封裝公共代碼,提高代碼的復(fù)用,減少代碼的維護(hù)。
自定義Cocoapods庫(kù),可以通過(guò)pod命令進(jìn)行創(chuàng)建。
創(chuàng)建Cocoapods庫(kù)
podspec是Cocoapods類庫(kù)的配置文件(Ruby語(yǔ)法)
可以使用命令行創(chuàng)建Cocoapods類庫(kù),命令如下:
pod lib create MyLibrary
運(yùn)行完命令之后需要選擇語(yǔ)言已經(jīng)測(cè)試代碼等,按照自己的項(xiàng)目需求選擇即可:
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:
- http://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and click links to open in a browser. )
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 ]
> Quick
Would you like to do view based testing? [ Yes / No ]
> Yes
Running pod install on your new library.
安裝完依賴之后,會(huì)得到一個(gè)pod-library.podspec文件,他的內(nèi)容一般都是下面這樣的:
Pod::Spec.new do |s|
s.name = 'pod-library'
s.version = '0.1.0'
s.summary = 'A short description of pod-library.'
...
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/jjz/pod-library'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'jjz' => 'woaf1003@gmail.com' }
s.source = { :git => 'https://github.com/jjz/pod-library.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'pod-library/Classes/**/*'
...
end
這段Ruby代碼的意思是創(chuàng)建一個(gè)Spec的配置,該項(xiàng)目發(fā)布之后可以被Pod直接引用,其中一些選項(xiàng)的意義如下:
-
source_files指定類庫(kù)中的源碼
在source_files中指定要發(fā)布的源代碼文件,這個(gè)項(xiàng)目的源代碼都是在pod-library(項(xiàng)目)目錄下,在這里指定了獲取pod-library/Classes/**/*目錄下的所有文件。
也可以分別指定不同的文件,比如需要使用swift就需要指定目錄下面的.swift文件,有c++源代碼的還可以指定.mm文件。
多個(gè)目錄使用,分割類似于下面的配置:
'pod-library/.{h,m}’,'pod-library/utils/.{h,m}’
- dependency指定類庫(kù)中的依賴庫(kù)
這個(gè)語(yǔ)法和podfile文件里面的pod文件很像,s.dependency后面指定類庫(kù)名稱和版本,如果加其他類庫(kù)的話需要再新起一行,比如添加OpenSSL的類庫(kù):
s.dependency 'OpenSSL', '1.0.110'
- 指定類庫(kù)中的資源文件
指定類庫(kù)中的資源文件,我們可以抽象出來(lái)一些公用的控件,比如progress,alert,prompt 等,這些控件需要使用資源文件。一般我們有可能打包的資源有聲音,圖片,xib...,有兩種指定資源文件的方式:
resources 和 resource_bundles
resources 指定的資源在調(diào)用類庫(kù)的項(xiàng)目中可以直接調(diào)用,和調(diào)用項(xiàng)目?jī)?nèi)的資源一樣。
而resource_bundles把需要調(diào)用的資源編譯到bundle來(lái)調(diào)用,
在這里我使用的是resources定義資源文件。
-
name類庫(kù)的名稱 -
version指定版本 -
license開(kāi)源協(xié)議 -
description簡(jiǎn)單描述 -
homepage個(gè)人主頁(yè) -
author作者信息 -
source指定git地址 -
platform指定iOS版本 -
requires_arc指定支持arc -
vendored_frameworks本地的frameworks -
frameworks指定需要使用的系統(tǒng)frameworks -
preserve_paths本地的.a庫(kù)
使用上面的配置可以完成把一個(gè)項(xiàng)目配置成Cocoapods類庫(kù),在項(xiàng)目中有些只是配置成一個(gè)類庫(kù)并不能滿足需求,有可能會(huì)需要一個(gè)以上的類庫(kù),例如一個(gè)是core核心類庫(kù),一個(gè)是logic業(yè)務(wù)邏輯類庫(kù),還可以使用subspec實(shí)現(xiàn)上述目的。
subspec
subspec是pod的一個(gè)屬性,用來(lái)指定pod類庫(kù)中的子類庫(kù)。配置subspec首先需要指定一個(gè)子類庫(kù),之后再指定子類庫(kù)對(duì)于的配置即可。配置如下:
s.subspec "Core" do |core|
core.source_files="pod-library/Core/**/*"
end
在定義一個(gè)自類庫(kù),該類庫(kù)依賴上面定義的子類庫(kù)Core,定義如下:
s.subspec "Logic" do |logic|
logic.dependency 'pod-library/Core'
logic.source_files="pod-library/Logic/**/*"
end
這樣就完成了兩個(gè)子類庫(kù)的定義,在調(diào)用的時(shí)候直接指定對(duì)應(yīng)的類庫(kù)即可,例如:
pod 'pod-library/Core', :path => '../'
以上是定義類庫(kù)的內(nèi)容,下面再看下如何在其他項(xiàng)目中調(diào)用已定義的類庫(kù)。
在項(xiàng)目中調(diào)用pod-library
創(chuàng)建一個(gè)和pod-library同級(jí)的目錄,命名為pod-project,用來(lái)調(diào)用pod-library。
在pod-project目錄中添加Podfile。
指定對(duì)pod-library的依賴:
platform :ios, '8.0'
target "pod-project" do
pod 'pod-library', :path => 'pod-library'
use_frameworks!
end
注意,這里必須使用use_frameworks!,Pod中使用Swift的類庫(kù)必須使用其標(biāo)識(shí),不然會(huì)出現(xiàn)錯(cuò)誤:
Pods written in Swift can only be integrated as frameworks; this feature is still in beta. Add `use_frameworks!` to your Podfile or target to opt into using it.
這里需要使用了path來(lái)指定本地的目錄作為庫(kù)的地址,這樣的作用是可以在pod-project項(xiàng)目中直接更新pod-library中的代碼,運(yùn)行安裝命令:
pod install
可以看到pod先去下載pod-library,然后再下載pod-library的依賴。
在pod-project如何更改pod-library的代碼呢?
下載完依賴庫(kù)之后,打開(kāi)pod-project.xcworkspace文件,會(huì)看到pods多了一個(gè)development pods的目錄,這個(gè)目錄下有pod-library項(xiàng)目的代碼以及資源。可以在這里直接編輯pod-library里的代碼,然后就可以直接提交代碼了,這是和其他的pods里的文件最大的區(qū)別,不加path的文件修改之后的文件在運(yùn)行pod install或pod update之后就會(huì)被重新覆蓋掉。
(這里pod-library使用的是git submodule的形式包含在項(xiàng)目中的)
參考 :
making cocoa pods
Using Pod Lib Create
開(kāi)源地址:
pod-library
pod-project