制作cocoapods私有倉(cāng)庫(kù)(一)依賴庫(kù)制作

前言
制作cocoapods私有倉(cāng)庫(kù) 首先是依賴庫(kù)的制作,然后才是cocoapods私有倉(cāng)庫(kù)的制作

依賴庫(kù)的制作的制作核心則是.podspec 的制作 。cocoapods私有倉(cāng)庫(kù)是負(fù)責(zé)管理這些.podspec 的倉(cāng)庫(kù)

下面以TestDemo2為例,記錄依賴庫(kù)的制作。

1.git倉(cāng)庫(kù)建立

cocoapods 是托管在github上的,這里我們使用國(guó)內(nèi)的git倉(cāng)庫(kù)碼云作為托管倉(cāng)庫(kù)平臺(tái)


圖例1.png

圖中8個(gè)地方:
1.項(xiàng)目名稱,也就是依賴庫(kù)的名稱,必填項(xiàng)
2.搜索路徑,也就是cocoapods搜索依賴庫(kù)的地址
3.項(xiàng)目介紹
4.項(xiàng)目開(kāi)發(fā)語(yǔ)言,cocoapod對(duì)針對(duì)依賴庫(kù)做檢測(cè),這個(gè)作為依據(jù)
5.git 忽略文件
6.開(kāi)源許可證 ,這里使用MIT,為啥要選不懂,歡迎科普
7.依賴庫(kù)類型,是否公開(kāi),我們選擇不公開(kāi),github私有倉(cāng)庫(kù)是收費(fèi)的,這里就是為啥選擇碼云作為倉(cāng)庫(kù)。
8.Readme,項(xiàng)目說(shuō)明文檔,建議勾選創(chuàng)建。

圖例2.png

2.clone到本地

clone倉(cāng)庫(kù)到本地,完成項(xiàng)目文件的添加

git clone https://git.oschina.net/ZOKAI/TestDemo2.git

如下,表明倉(cāng)庫(kù)已完成clone

Cloning into 'TestDemo2'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.

本地目錄


圖例3.png

添加過(guò)項(xiàng)目文件的本地目錄

git add -A && git commit -m 'add project file'
git push origin master
圖例4.png

3 .podspec 文件

依賴庫(kù)的核心就是.podspec 文件的創(chuàng)建
有兩種方式創(chuàng)建podspec文件:
1.從其他地方復(fù)制過(guò)來(lái),然后修改
2.使用命令行
我們這里使用命令行創(chuàng)建

 pod spec create TestDemo2

里面有很多的內(nèi)容,但是大多數(shù)都是我們不需要的,所以我們只需要根據(jù)項(xiàng)目的情況保留關(guān)鍵的內(nèi)容
podspec 文件配置



Pod::Spec.new do |s|


  s.name         = "TestDemo2" #specc文件的名稱
  s.version      = "1.0.0" #對(duì)應(yīng)的版本
  s.summary      = "簡(jiǎn)短介紹 TestDemo2." #簡(jiǎn)短介紹
  s.description  = <<-DESC 
  測(cè)試用例,這里是詳細(xì)介紹,可以不寫(xiě),但是
                   DESC

  s.homepage     = "https://git.oschina.net/ZOKAI/TestDemo2.git" #注意
  # s.screenshots  = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"

  s.license      = "MIT" #開(kāi)源協(xié)議
  # s.license      = { :type => "MIT", :file => "FILE_LICENSE" }

  s.author             = { "ZOKAI" => "1558390418@qq.com" } #作者,郵箱
  # Or just: s.author    = "ZOKAI"
  # s.authors            = { "ZOKAI" => "1558390418@qq.com" }
  # s.social_media_url   = "http://twitter.com/ZOKAI"

  # s.platform     = :ios
  s.platform     = :ios, "8.0" #平臺(tái),版本

  #  When using multiple platforms
  # s.ios.deployment_target = "5.0"
  # s.osx.deployment_target = "10.7"
  # s.watchos.deployment_target = "2.0"
  # s.tvos.deployment_target = "9.0"

  s.source       = { :git => "https://git.oschina.net/ZOKAI/TestDemo2.git", :tag => "#{s.version}" }#對(duì)應(yīng)的資源文件的地址,注意后邊的tag ,其實(shí)就是他的版本,pods是以git為基礎(chǔ)管理的。
## 這里不支持ssh的地址,只支持HTTP和HTTPS,最好使用HTTPS
## 正常情況下我們會(huì)使用穩(wěn)定的tag版本來(lái)訪問(wèn),如果是在開(kāi)發(fā)測(cè)試的時(shí)候,不需要發(fā)布release版本,直接指向git地址使用
  s.source_files  = "TestDemo2/TestDemo2/Class/**/*.{h,m}" #編譯源文件
  s.exclude_files = "Classes/Exclude" #排除文件

  s.requires_arc = true #是否是arc模式 
  s.frameworks = "UIKit", "Foundation"#使用的framworks 這里可以是系統(tǒng)的framework 也可以是部分第三方中包含的frameworks ,多個(gè)以","隔開(kāi)

  s.dependency "SVProgressHUD", "~> 2.1.2"#使用了cocopoads第三方依賴庫(kù) ,多個(gè)以","隔開(kāi)
  s.module_name = 'TestDemo2' #模塊名稱


  # s.public_header_files = "Classes/**/*.h" #公開(kāi)的頭文件

  # s.resource  = "icon.png"
  # s.resources = "Resources/*.png"

  # s.preserve_paths = "FilesToSave", "MoreFilesToSave"

  # s.framework  = "SomeFramework"

  # s.library   = "iconv"
  # s.libraries = "iconv", "xml2"


  # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }

end

s.module_name = 'TestDemo2' #模塊名稱 這個(gè)需要特別留意,這個(gè)是最終使用pod 'xxx' 的名稱

圖例5是依賴庫(kù)工程的組織目錄


圖例5.png

圖例6是最終制作完畢的私有倉(cāng)庫(kù)在使用的時(shí)候的組織目錄,對(duì)比可見(jiàn)目錄結(jié)構(gòu)已經(jīng)打亂


圖例6.png

圖例7 是AFNetworking在使用的時(shí)候的組織目錄,對(duì)比發(fā)現(xiàn)仍然保持有目錄結(jié)構(gòu)
圖例7.png

如果需要保持組織結(jié)構(gòu) ,如AFNetworking 的組織目錄 則需要在.podspec 配置。參考AFNetworking.podspec

Pod::Spec.new do |s|
 s.name     = 'AFNetworking'#sepc文件的名字
 s.version  = '2.5.4'#對(duì)應(yīng)的版本
 s.license  = 'MIT'#開(kāi)源協(xié)議
 s.summary  = 'A delightful iOS and OS X networking framework.'#簡(jiǎn)單的介紹
 s.homepage = 'https://github.com/AFNetworking/AFNetworking'#主頁(yè)
 s.social_media_url = 'https://twitter.com/AFNetworking'#作者的twitter 
 s.authors  = { 'Mattt Thompson' => 'm@mattt.me' }#作者 和他的郵箱
 s.source   = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version, :submodules => true }#對(duì)應(yīng)的資源文件的地址,注意后邊的tag ,其實(shí)就是他的版本,pods是以git為基礎(chǔ)管理的。版本就是tag值了
 s.requires_arc = true#是否是arc模式 

 s.ios.deployment_target = '6.0'#iOS對(duì)應(yīng)的版本
 s.osx.deployment_target = '10.8'#OX S 對(duì)應(yīng)的版本

 s.public_header_files = 'AFNetworking/*.h'#公共的頭文件地址
 s.source_files = 'AFNetworking/AFNetworking.h'#文件地址,pod會(huì)以這個(gè)地址下載需要的文件構(gòu)建pods

 s.subspec 'Serialization' do |ss|#對(duì)應(yīng)的一些子工程
   ss.source_files = 'AFNetworking/AFURL{Request,Response}Serialization.{h,m}'
   ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics'
   ss.osx.frameworks = 'CoreServices'
 end

 s.subspec 'Security' do |ss|
   ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}'
   ss.frameworks = 'Security'
 end

 s.subspec 'Reachability' do |ss|
   ss.source_files = 'AFNetworking/AFNetworkReachabilityManager.{h,m}'
   ss.frameworks = 'SystemConfiguration'
 end

 s.subspec 'NSURLConnection' do |ss|
   ss.dependency 'AFNetworking/Serialization'
   ss.dependency 'AFNetworking/Reachability'
   ss.dependency 'AFNetworking/Security'

   ss.source_files = 'AFNetworking/AFURLConnectionOperation.{h,m}', 'AFNetworking/AFHTTPRequestOperation.{h,m}', 'AFNetworking/AFHTTPRequestOperationManager.{h,m}'
 end

 s.subspec 'NSURLSession' do |ss|
   ss.dependency 'AFNetworking/Serialization'
   ss.dependency 'AFNetworking/Reachability'
   ss.dependency 'AFNetworking/Security'

   ss.source_files = 'AFNetworking/AFURLSessionManager.{h,m}', 'AFNetworking/AFHTTPSessionManager.{h,m}'
 end

 s.subspec 'UIKit' do |ss|
   ss.ios.deployment_target = '6.0'

   ss.dependency 'AFNetworking/NSURLConnection'
   ss.dependency 'AFNetworking/NSURLSession'

   ss.ios.public_header_files = 'UIKit+AFNetworking/*.h'
   ss.ios.source_files = 'UIKit+AFNetworking'
   ss.osx.source_files = ''
 end
end

AFNetworking是通過(guò)subspec 來(lái)保持子目錄結(jié)構(gòu)的,如果有需求的可以在這里特殊配置。

4.檢測(cè)podspec文件

podspec文件默認(rèn)有error 和warning 都不會(huì)檢測(cè)通過(guò) --allow-warnings 參數(shù)會(huì)運(yùn)行warnings 可以加上 --verbose 參數(shù)查看debug信息

pod lib lint --allow-warnings

檢測(cè)成功,即表明依賴庫(kù)制作完畢

 -> TestDemo2 (1.0.0)
TestDemo2 passed validation.

這里介紹一個(gè)情況
如圖例8 ,使用RongCloudIM的時(shí)候發(fā)現(xiàn),里面有.a 靜態(tài)庫(kù)和.framework

圖例8.png

依舊使用

pod lib lint TestDemo2.podspec --allow-warnings --verbose

檢測(cè),會(huì)出現(xiàn)如下錯(cuò)誤

- ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include static binaries: 
(/private/var/folders/2c/78rv4swj57n7pvzdy7jk3w0w0000gn/T/CocoaPods/Lint/Pods/RongCloudIM/RongCloudIM/RongIMKit.framework, 
/private/var/folders/2c/78rv4swj57n7pvzdy7jk3w0w0000gn/T/CocoaPods/Lint/Pods/RongCloudIM/RongCloudIM/libopencore-amrnb.a,
 and /private/var/folders/2c/78rv4swj57n7pvzdy7jk3w0w0000gn/T/CocoaPods/Lint/Pods/RongCloudIM/RongCloudIM/RongIMLib.framework)

原因就是依賴庫(kù)(s.dependency)包含了.a靜態(tài)庫(kù)造成的,解決方法是,添加 --use-libraries 來(lái)讓檢測(cè)通過(guò)

pod lib lint TestDemo2.podspec --allow-warnings --verbose --use-libraries

這樣在以后使用私有倉(cāng)庫(kù)的時(shí)候。podfile 需要做如下修改

pre_install do |installer|
def installer.verify_no_static_framework_transitive_dependencies; end
end

下一篇
制作cocoapods私有倉(cāng)庫(kù)(二)cococapods私有倉(cāng)庫(kù)制作

參考:
折騰cocoaPods, 創(chuàng)建自己的依賴庫(kù)
'The 'Pods' target has transitive dependencies that include static binaries' when installing 'xxxx'

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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