背景說明
之前一段時間因為公司需要幫客戶定制自己的App蛹尝,但是基本邏輯都是跟我們現(xiàn)有App差不多后豫,如果直接copy一份項目出來改名,無疑會為將來的維護成本添加難度突那,倒不是說解決困難挫酿,而是需要copy重復的代碼,項目少的時候還好說愕难,一旦多起來......
因此饭豹,將公共部分的代碼抽離出來變得很有必要,抽取出來的這部分公共代碼使用Cocoapod進行管理無疑是當下最好的選擇务漩,下面分享在使用Cocoapod創(chuàng)建私有庫的一些經(jīng)驗拄衰,希望能夠幫到你。
利用Cocoapod創(chuàng)建私有庫
一饵骨、創(chuàng)建podspec文件
在終端上cd到需要創(chuàng)建的目錄文件夾下翘悉,然后執(zhí)行命令pod spec create xxx
,其中xxx
就是對應的podspec文件名居触,應保持與當前統(tǒng)計文件夾名字一致妖混,例如:
pod spec create Tool // 此時生成的podspec文件就是 Tool.podspec
二、配置podspec文件
基本用法
下面是基本的一些配置轮洋,想要使用可以直接copy然后替換其中的內(nèi)容為自己的即可制市。具體意義是什么我就不解釋了,看字面就可以看得出來弊予,在生成的podspec文件里面也有對應的注釋祥楣,想了解的話可以看注釋。
Pod::Spec.new do |s|
s.name = "Tool"
s.version = "0.0.1"
s.summary = "A short description of Tool."
s.description = "我的一些工具類組件"
s.homepage = "https://gitee.com/hanten"
s.license = "MIT"
s.author = { "Hanten" => "zhiqiangit@126.com" }
s.platform = :ios
s.ios.deployment_target = '8.0'
s.source = { :git => "https://gitee.com/hanten/swift_pod.git", :tag => "#{s.version}" }
s.source_files = "Tool/**/*.{h,m}}" # 如果是swift就將.{h,m}換為.swift
end
高級用法
1、依賴
// 依賴第三方框架
s.dependency 'AFNetworking'
// 依賴第三方存放本地的.framework误褪,Resource是與Tool同級的文件夾责鳍,我用來放資源的地方,路徑可以根據(jù)自己具體配置
s.ios.vendored_frameworks 'Resource/*.framework'
// 依賴第三方存放本地的.a
s.ios.vendored_libraries = "Resource/*.a"
// 依賴系統(tǒng).framework
s.frameworks = 'SystemConfiguration','CoreGraphics','CoreTelephony'
// 依賴系統(tǒng).a
s.libraries = 'iconv','sqlite3','stdc++'
2兽间、資源文件(包括圖片历葛、plist文件、xib文件)
一般情況下私有庫圖片等資源文件是放在bundle下的嘀略,在使用的時候需要從bundle中拿取出來恤溶,比如:
// 我新建了一個叫myShare.bundle文件夾,里面存放圖片帜羊,然后我需要引用它宏娄,在podspec文件中
s.resource = "Resource/myShare.bundle"
// 在OC代碼中,在使用的時候逮壁,如果不指定bundle的話會找不到該圖片資源
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"myShare" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *image = [UIImage imageNamed:@"my_share_session" inBundle:bundle compatibleWithTraitCollection:nil];
// 需要注意的是xib文件的引用孵坚,在podspec中配置,就會在pod install后自動生成ShareXibBundle窥淆,或者你把xib放在自己建的bundle下卖宠,在引用的時候也需要指定該bundle
s.resource_bundles = {
'ShareXibBundle' => ['Tool/Share/**/*.xib']
}
// 在OC中引用,比如注冊cell忧饭,這樣才能正確引用到xib文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"ShareXibBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
[_tableView registerNib:[UINib nibWithNibName:@"ShareCell" bundle:bundle] forCellReuseIdentifier:@"Cell"];
3扛伍、使用subspec分模塊引入
有的時候我們并不希望將所有的模塊都一起被引入到項目中,因為某些模塊我們壓根就用不到词裤,但是卻因為其他需要的模塊被一起引入進來了刺洒,這個就很煩了。
這時候我們就需要分模塊引入了吼砂,分模塊引入我知道的兩種方式:
1逆航、建立多個podspec,每一個模塊對應一個podspec文件渔肩,這樣的話就會新建很多個podspec去對應因俐,麻煩且看起來不優(yōu)雅,不建議使用周偎;
2抹剩、使用subspec,只需要添加一個主的podspec即可蓉坎,這是目前我在使用的澳眷,下面是我的配置:
Pod::Spec.new do |s|
s.name = "Tool"
s.version = "0.0.1"
s.summary = "A short description of Tool."
s.description = "我的一些工具類組件"
s.homepage = "https://gitee.com/hanten"
s.license = "MIT"
s.author = { "Hanten" => "zhiqiangit@126.com" }
s.platform = :ios
s.ios.deployment_target = '8.0'
s.source = { :git => "https://gitee.com/hanten/swift_pod.git", :tag => "#{s.version}" }
# s.source_files = "Tool/**/*.{h,m}}" # 如果是swift就將.{h,m}換為.swift
# 基礎(chǔ)依賴
s.subspec "Base" do |ss|
ss.source_files = "Tool/Base/**/*.{h,m}}"
end
# 日期控件
s.subspec "Date" do |ss|
ss.source_files = "Tool/Date/**/*.{h,m}"
end
# 分享組件
s.subspec "Share" do |ss|
ss.source_files = "Tool/Share/**/*.{h,m}"
ss.dependency 'Tool/Base'
end
end
只需要簡單的配置就可以分模塊引入了,相關(guān)的依賴在subspec上寫就可以了蛉艾。
需要注意的是父spec需要把source_files給去掉钳踊,因為我們使用了subspec來引用
三衷敌、項目引用
正常引用
如果沒有使用分模塊引用,那么在Podfile中應該這樣引用:
pod 'Tool', :path => '../swift_pod'
分模塊引用
使用了分模塊引用箍土,在Podfile中如下引用:
pod 'Tool', :path => '../swift_pod', :subspecs => [
'Date', # 日期控件
'Share' # 分享組件
]
后記
最近有時間會把之前的一些項目經(jīng)驗分享出來逢享,有什么寫得不對的歡迎大家指正罐监,共同進步吴藻!點擊跳轉(zhuǎn)Cocoapod官方鏈接