從零用CocoaPods創(chuàng)建私有索引庫(kù)

前言

什么是索引庫(kù)?為什么要?jiǎng)?chuàng)建私有索引庫(kù)?終端輸入pod repo,如果之前沒(méi)有配置過(guò),輸出信息為:

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/Jack/.cocoapods/repos/master

瀏覽器打開(kāi)https://github.com/CocoaPods/Specs,可以看到一個(gè)Specs文件夾,文件夾內(nèi)包含目前所有支持CocoaPods框架的索引,但https://github.com/CocoaPods/Specs.git是公開(kāi)索引庫(kù),只能添加公開(kāi)(開(kāi)源)框架,如果想讓私有框架支持CocoaPods,這個(gè)時(shí)候必須用私有索引庫(kù)。

正文

如果私有框架已經(jīng)存在,只需進(jìn)入對(duì)應(yīng)本地項(xiàng)目根目錄,創(chuàng)建podspec填寫(xiě)正確信息后上傳,并將podspec文件push到私有索引庫(kù)即可。

pod spec create [podspec文件名]   //創(chuàng)建podspec
pod lib lint    //podspec本地驗(yàn)證
pod spec lint     //podspec遠(yuǎn)程驗(yàn)證
git add .
git commit -m xx
git push origin master
pod repo push [私有索引庫(kù)]  [podspec文件]    //將podspec文件push到私有索引庫(kù)

如果從零開(kāi)始創(chuàng)建私有框架,可以按以下步驟執(zhí)行:

(以下均以TestLib為例,請(qǐng)自行替換)

終端進(jìn)入準(zhǔn)備創(chuàng)建lib的文件夾,執(zhí)行命令

pod lib create TestLib

這個(gè)過(guò)程可能需要等待幾秒,之后會(huì)出現(xiàn)如下信息:

What language do you want to use?? [ Swift / ObjC ]
Would you like to include a demo application with your library? [ Yes / No ]
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Would you like to do view based testing? [ Yes / No ]

根據(jù)提示輸入即可,完成后會(huì)自動(dòng)打開(kāi)TestLib對(duì)應(yīng)的Example工程

執(zhí)行tree命令查看目錄結(jié)構(gòu)

01:TestLib Jack$ tree TestLib -L 2
TestLib
├── Example
│   ├── Podfile
│   ├── Podfile.lock
│   ├── Pods
│   ├── TestLib
│   ├── TestLib.xcodeproj
│   ├── TestLib.xcworkspace
│   └── Tests
├── LICENSE
├── README.md
├── TestLib
│   ├── Assets
│   └── Classes
├── TestLib.podspec
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj

10 directories, 5 files

將組件放入TestLib/Classes中,并刪除ReplaceMe.m,進(jìn)入Example文件夾執(zhí)行pod install后,TestLib對(duì)應(yīng)的Example工程已經(jīng)裝載好,可以進(jìn)行demo演示。以后每次更新lib,都需要進(jìn)到Example中執(zhí)行pod install獲取最新代碼

TestLib/Classes

  • 創(chuàng)建遠(yuǎn)程私有庫(kù)

由于github創(chuàng)建私有庫(kù)需要付費(fèi),這里用coding進(jìn)行演示

遠(yuǎn)程私有庫(kù)

這里README.md、開(kāi)源許可證、gitignore都不需要添加,從上面TestLib的目錄結(jié)構(gòu)可以看到,pod lib create已經(jīng)創(chuàng)建了這三個(gè)文件,如果添加,在commit時(shí)候會(huì)導(dǎo)致沖突(文件內(nèi)容不完全相同),所以只要?jiǎng)?chuàng)建一個(gè)最干凈的私有庫(kù)。

  • 修改podspec文件

Pod::Spec.new do |s|
  s.name             = 'TestLib'
  s.version          = '0.1.0'
  s.summary          = 'TestLib'

  s.description      = <<-DESC
TestLib只是一個(gè)演示
                       DESC

  s.homepage         = 'https://coding.net/u/coder_01/p/TestLib'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { '01_Jack' => '123@qq.com' }
  s.source           = { :git => 'git@git.coding.net:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

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

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

  • 對(duì)podspec進(jìn)行本地驗(yàn)證:
pod lib lint --private

如果因?yàn)閣aring驗(yàn)證不通過(guò)可以加上--allow-warnings,遠(yuǎn)程驗(yàn)證和pod repo push同理

  • 打包

驗(yàn)證通過(guò)后打包類庫(kù),這里可以用cocoapods的插件cocoapods-packager來(lái)完成(手動(dòng)打包太麻煩)。如果之前沒(méi)有安裝cocoapods-packager,執(zhí)行以下命令:

sudo gem install cocoapods-packager

打包:

pod package TestLib.podspec  --force

默認(rèn)打包成.framework,如果加上--library則打包成.a

驗(yàn)證通過(guò)后,通過(guò)git status可查看當(dāng)前git改變狀態(tài),不需要提交的文件可添加到gitignore中。

git status
git add .
git commit -m 'first blood'

到這里已經(jīng)可以將代碼提交到遠(yuǎn)程倉(cāng)庫(kù),但需要先添加倉(cāng)庫(kù)地址再提交

  • 添加公鑰
ssh-keygen

將生成的公鑰id_rsa.pub添加到賬戶

添加公鑰
git remote add origin git@git.coding.net:coder_01/TestLib.git
git push origin master

在對(duì)podspec做遠(yuǎn)程驗(yàn)證前要先push tag,tag必須與podspec中的version一致

git tag 0.1.0
git push --tags
pod spec lint --private

遠(yuǎn)程驗(yàn)證通過(guò)后,將TestLib.podspec push到遠(yuǎn)程私有索引庫(kù),同樣,需要先添加倉(cāng)庫(kù)再push

  • 創(chuàng)建私有索引庫(kù)
私有索引庫(kù)
pod repo add PrivateSpecs git@git.coding.net:coder_01/PrivateSpecs.git
pod repo push PrivateSpecs TestLib.podspec

此時(shí)本地索引庫(kù)長(zhǎng)這樣

cd ~/.cocoapods/repos
open .
PrivateSpecs

最基本的制作到這里就完成了,現(xiàn)在能搜到TestLib這個(gè)庫(kù)

pod search TestLib
pod search

新建工程,pod init,修改podfile文件。這里需要添加兩個(gè)source,一個(gè)原master repo,一個(gè)后添加的PrivateSpecs

source 'git@git.coding.net:coder_01/PrivateSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'

use_frameworks!

target 'Test' do
pod 'TestLib'
end

執(zhí)行pod install即可使用TestLib框架

Tip:如果組件中含有圖片、音視頻、xib/storyboard等,podspec的描述與代碼中的寫(xiě)法都需要改變

重新回到podspec文件

  s.source_files = 'TestLib/Classes/**/*'

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

s.source_files用來(lái)找代碼,s.resource_bundles用來(lái)找資源。
TestLib/Classes/**/*表示匹配TestLib/Classes文件夾下所有子目錄的所有文件

Pattern:*
  • *匹配所有文件
  • c*匹配所有以c開(kāi)頭的文件
  • *c匹配所有以c結(jié)尾的文件
  • *c*匹配所有包含c的文件
Pattern: **
  • **遞歸匹配所有子文件夾

未組件化前,加載圖片、音視頻、xib/storyboard等資源可通過(guò)mainBundle來(lái)加載,現(xiàn)在要通過(guò)組件自帶bundle來(lái)獲取資源。TestLib會(huì)自動(dòng)將s.resource_bundles下指定的路徑資源打成bundle包,并命名為T(mén)estLib.bundle

s.resource_bundles

但是,并不一定要把資源放到Assets文件夾下,可以是任意文件夾(如目錄結(jié)構(gòu)中的Classes或者新建),只要能找到資源即可。同樣,如果包含資源s.source_files要這樣寫(xiě):

 s.source_files = 'TestLib/Classes/**/*{.h,.m}'

如果不這樣寫(xiě),若Classes中包含資源文件,會(huì)導(dǎo)致崩潰。此時(shí)先找到TestLib.bundle,再?gòu)倪@個(gè)bundle中加載資源就可以了

// 獲取bundle資源
NSBundle *bundle = [NSBundle bundleForClass:[self class]];

podspec還有一些常用玩法,如subspecdependencyvendored_frameworksvendored_librariesprefix_header_contentsprefix_header_file

podspec更多配置可參考Podspec Syntax Reference

Have fun !

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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