IOS 創(chuàng)建CocoaPods遠(yuǎn)程私有代碼庫和公開庫

https://guides.cocoapods.org官網(wǎng)
有些時候我們的項目太過于龐大,需要進(jìn)行組建化開發(fā),可以將每個模塊開發(fā)成一個組件?;蛘呤俏覀兊囊恍┳约簬欤胗胮od導(dǎo)入,又不想使用本地路徑的方式。這時候我們就可以做一個遠(yuǎn)程的私有代碼倉庫,這樣我們開發(fā)的庫就可以滿足我們自己用pod進(jìn)行導(dǎo)入,又不用讓別人看到;
因為索引庫中之存放框架的描述信息,真正的框架是存放在描述信息制定的地址之中,所有我們要想把自己的代碼放到pods索引庫中,我們首先應(yīng)該是給自己的遠(yuǎn)程倉庫的框架添加一個描述文件,將描述文件上傳到遠(yuǎn)程框架的索引庫當(dāng)中,1開發(fā)框架->2添加spec文件->3上傳spec到索引庫
進(jìn)入github索引cocoapods可以看到一個Cocoapods/spec文件

首先我們可以現(xiàn)在遠(yuǎn)程代碼倉庫創(chuàng)建一個新的倉庫用來存放我們自己框架的源碼;然后在我們電腦上面床架一個git倉庫,然后將我們本地的git倉庫和遠(yuǎn)程的代碼倉庫建立連接,可以使用clone也可以
手動連接git remote add origin 連接地址;
使用 git remote測試是否添加;
使用 git push origin master將本地代碼推送遠(yuǎn)程倉庫;
使用終端cd到git同級目錄創(chuàng)建spec文件 pod spec create TestLib,一般名稱和代碼的文件名一致;
創(chuàng)建好spec文件就可以修改里面的信息了:
里面有homepage

spec.name         = 'Reachability' 框架名
  spec.version      = '3.1.0' 版本號
  spec.license      = { :type => 'BSD' }
  spec.homepage     = 'https://github.com/tonymillion/Reachability' 主頁
  spec.authors      = { 'Tony Million' => 'tonymillion@gmail.com' } 作者
  spec.summary      = 'ARC and GCD Compatible Reachability Class for iOS and OS X.' 描述
spec.description = <<-DESC
                     Computes the meaning of life.
                     Features:
                     1. Is self aware
                     ...
                     42. Likes candies.
                   DESC 詳細(xì)描述這個字?jǐn)?shù)要比上面summary長并且不可以為空
  spec.source       = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' } 遠(yuǎn)程倉庫的地址,發(fā)布的本號,一般
  spec.source_files = 'Reachability.{h,m}'
  spec.framework    = 'SystemConfiguration'
spec.source_files  = "Classes", "Classes/**/*.{h,m}" 需要添加到倉庫的文件
 spec.exclude_files = "Classes/Exclude"
 spec.source_files       = 'Reachability/common/*.swift' 需要下載的文件,放到項目里面的,這個路徑是spec文件對應(yīng)的相對路徑,

接下里需要給git設(shè)置tag這里面的tag鑰匙spec的tag保持一致,因為他檢索的時候需要根據(jù)這個tag去遠(yuǎn)程倉庫查找
添加tag
git tag 0.1.1 -m'描述文字'
把tag推送到遠(yuǎn)程代碼倉庫
git push --tags
這時候刷新遠(yuǎn)程代碼倉庫,就可以看到這個0.0.1的新版本了
接下來要把我們的spec上傳到遠(yuǎn)程框架的索引庫中了,首先注冊一下trunk,這個trunk就是允許我們將自己本地的sdk上傳到官方的spec索引庫中
pod trunk register 759542164@qq.com 'SLL' --description='蘇'
驗證完成之后 就可提交了pod trunk push TestLib.podspec,直接提交可能因為警告不能成功。使用命令pod trunk push TestLib.podspec --allow-warnings這里的文件名要注意別寫錯
提交成功之后,遠(yuǎn)程索引庫會自動同步本地的索引庫,如果提交成功本地還是索引不到,可能是本地索引沒有更新
使用命令
pod install --no-repo-update下載不需要檢查更新
pod install --repo-update 檢查本地更新
如果想搜索的話可以使用 pod search XXX

創(chuàng)建遠(yuǎn)程私有代碼倉庫,

只有我們自己可以使用將代碼放到遠(yuǎn)程代碼倉庫,共自己項目組使用

  1. 在代碼托管平臺創(chuàng)建我們的代碼倉庫,因為GitHub上面私有的要錢,所以我們可以其他的比如碼云,coding都可以,這里我使用的是coding ,先在網(wǎng)上創(chuàng)建好我們的代碼倉庫。復(fù)制url連接
    原理:
    創(chuàng)建遠(yuǎn)程代碼倉庫->生成spec文件->上傳spec到代碼倉庫
    生成我們自己的遠(yuǎn)程代碼庫,將我們遠(yuǎn)程代碼倉庫的spec上傳到我們自己的私有的索引庫,然后在本地生成我們的本地索引庫。
    我們自己的授權(quán)的用戶可以使用

私有庫的劃分,主要骨架做成私有庫而不是所有的文件都是一個庫,根據(jù)不同功能和模塊劃分。
基礎(chǔ)組件(分類)、功能組件、業(yè)務(wù)組件(骨架);業(yè)務(wù)組件依賴基礎(chǔ)組件
創(chuàng)建組件庫文件夾testLib->FMBases->Classes->文件

創(chuàng)建本地私有庫FMBases->
git init-> git add.-> git commit -m 初始化
添加pod
pod init->pod install
創(chuàng)建podspec文件
pod spec create FMBases在描述文件里面寫這個信息

將本地庫集成到宿主項目里面
pod init->pod install生成podfile文件配置庫的信息

target 'XMGFM' do
frameworks
  use_frameworks!
  pod 'XMGFMBase', :path=>'../localLib/XMGFMBase'相對路徑
end

然后執(zhí)行pod install

生成私有的索引庫

在遠(yuǎn)程創(chuàng)建我們代碼倉庫XMGFMSpecs,復(fù)制倉庫的url或者使用ssh公鑰匙和私鑰匙,私鑰匙留著,公鑰匙給外界
如何生成一個公鑰
終端ssh-keygen
存放目錄在 /Users/luosu/.ssh/id_rsa.pub

  1. 添加自己的本地索引庫
    pod repo add 庫名 url
    pod repo add 庫名 ssh
    可以在終端執(zhí)行pod repo查看當(dāng)前存在的索引庫
    添加成功之后,我們就有了自己的索引庫了。
    將開發(fā)代碼上傳到遠(yuǎn)程倉庫,這個需要新建一個倉庫,不是剛剛的索引倉庫

cd到本地創(chuàng)建一個remoteLib文件夾

  1. 創(chuàng)建一個我們需要開發(fā)的組件,創(chuàng)建一個模版庫
    pod lib create XMGFMBase
What platform do you want to use?? [ iOS / macOS ]
 > iOS
What language do you want to use?? [ Swift / ObjC ]
 > ObjC
Would you like to include a demo application with your library? [ Yes / No ]
 > Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None
Would you like to do view based testing? [ Yes / No ]
 > No
What is your class prefix?
 > XMG

然后終端就會執(zhí)行一些基本讓我選擇的基本選項,執(zhí)行完之后就創(chuàng)建了一個帶有基礎(chǔ)組件和demo案例的項目,用來測試的項目,這是后我們需要把我們的組件放到XMGFMBase/Classes/
然后 安裝一下pod 文件 pod install
修改了podspec文件相關(guān)配置,因為別人下載是根據(jù)podspec里面的信息找遠(yuǎn)程代碼倉庫。主要是source等內(nèi)容
然后回到XMGFMBase文件夾
使用pod lib lint它自動檢索當(dāng)前文件夾下的spec文件,進(jìn)行本地驗證,他不會驗證source里面的tag。但是如果遠(yuǎn)程驗證pod spec lint的話會發(fā)現(xiàn)沒有tag會報錯,因為他會去驗證我們的代碼倉庫,這時候我們創(chuàng)建好的代碼還沒有提交到遠(yuǎn)程代碼倉庫呢,
git init->git add .->git commit -m xxx->git remote add origin https://gitee.com/stop_and_stop/xmgfmbase.git->git push -u origin "master"然后代碼提交到遠(yuǎn)程代碼倉庫
這時候還有創(chuàng)建tag,遠(yuǎn)程驗證依然不通過
添加tag,這里面的tag要跟.podspec里面的version保持一致
git tag -a 0.1.0 -m '描述文字'
把tag推送到遠(yuǎn)程代碼倉庫
git push --tags
一旦驗證成功,就說明私有庫索引沒有問題,然后把索引文件傳到自己的XMGFMBase私有索引庫當(dāng)中,
pod repo push XMGFMBase XMGFMBase.podspec --allow-warnings這句會自動上傳到遠(yuǎn)程私有索引庫里面

然后我們再使用的時候需要在podFile文件里面添加私有庫的source
source 'https://e.coding.net/shllearn/shlprivatestore/shlprivatestore.git'
這樣設(shè)置之后可以加載自己遠(yuǎn)程私有庫了,但是還不能加載共有的遠(yuǎn)程私有庫,所以還要添加公共的索引庫source
source 'https://cdn.cocoapods.org/'
Podfile文件具體配置

source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
source 'https://cdn.cocoapods.org/'
use_frameworks!
platform :ios, '9.0'

target 'XMGFMBase_Example' do
  pod 'XMGFMBase'
  pod 'MJExtension'
end

遠(yuǎn)程私有索引庫的升級

cd到模版庫文件,將需要增加的代碼,copy到Classes文件,
修改podspec文件,
pod install
更改版本號,
git add .-> git commit -m xxx->git push
添加tag
git tag -a 0.2.0 -m xxx->git push --tag
驗證文件本地pod lib lint 遠(yuǎn)程pod spec lint
更新新本地索引庫
pod repo push XMGFMBase XMGFMBase.podspec --allow-warnings

如果出現(xiàn)奇怪的錯誤,可以把原來下載的pod 用命令 pod installs清理一下
然后 Example里面pod install一下,
不更新索引庫 pod update --no-repo-update更新框架不更新索引庫

遠(yuǎn)程私有庫依賴+升級

把需要使用第三方庫的組件拖入Classes
執(zhí)行pod install example里面可以看到新的組件
如果自己的組件庫中使用了第三方的庫就需要添加依賴,
修改spec文件
s.dependency 'AFNetworking'
s.dependency 'SDWebImage'
這樣在下載私有庫的庫時候會檢測哪些依賴的庫,如果有就會把依賴庫一起下載過來。
pod install
編譯一下看是否成功,成功之后提交遠(yuǎn)程代碼倉庫
git add .->git commit -m xxx->git push
git tag 0.3.1->git push --tags
驗證sepc文件是合法pod spec lint
成功就提交到本地索引庫pod repo push XMGFMSpecs XMGFMBase.podspec --allow-warnings
用另外的工程引入第三方可以使用就可以

遠(yuǎn)程倉庫私分支

因為我們有時候字需要倉庫的一部分組件的功能,所以要實現(xiàn)分支功能SubSpecs
修改podspec文件

s.subspec 'Base自控名稱' do |b別名|
  b.source_files = 'XMGFMBase/Classes/Base/**/*'
end 

將主庫的s.source_files注釋
如果有的庫需要依賴第三方的框架,不能直接寫在外面了,

s.subspec 'Network自控名稱' do |n|
  n.source_files = 'XMGFMBase/Classes/Network/**/*'
  n.denpendency = 'AFNetworking'
end 

修改完成測試沒有錯誤以后,上傳代碼到遠(yuǎn)程倉庫
git add .-> git commit -m xxxx->git push
添加tag
git tag 0.2.2 ->git push --tags
驗證spec文件是否符合格式
pod spec lint --allow-warnings
上傳到本地私有索引庫
pod repo push XMGFMSpecs XMGFMBase.podspec --allow-warnings
成功之后 使用
pod search XMGFMBase測試有沒有
在宿主工程測試一下可以用了么

source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0'

target 'XMGFM' do
  use_frameworks!

pod 'XMGFMBase/Category'
#pod 'XMGFMBase/Base'
#pod 'XMGFMBase', :subspecs => ['Base', 'Category']
#pod 'MJExtension'
end

主骨架組件化

創(chuàng)建一個新的框架
pod lib create XMGFMMain

填寫框架的信息
What platform do you want to use?? [ iOS / macOS ]
 > iOS
What language do you want to use?? [ Swift / ObjC ]
 > ObjC
Would you like to include a demo application with your library? [ Yes / No ]
 > Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None
Would you like to do view based testing? [ Yes / No ]
 > No
What is your class prefix?
 > XMG

這樣創(chuàng)建的工程里面Example對框架是引用的關(guān)系,不是copy所以才可以邊開發(fā)邊調(diào)試
將main里面的Controller,View代碼copy到當(dāng)前框架XMGFMMain文件夾里面,Example pod install就可以了
顯build一下看是否需要依賴,如果需要記得修改podspec文件
s.dependency 'XMGFMBase/Category'
然后因為加載的是私有庫的框架,所以記得修改podfiles的source

source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
source 'https://github.com/CocoaPods/Specs.git' 

然后pod install加載組件庫
到這步運(yùn)行還是有錯誤,因為加載不了NIB等資源,因為使用加載這些資源使用時mainbundle來加載的,而現(xiàn)在資源不在mainBundle里面
查詢當(dāng)前的bundle路徑

NSBundle *currentBundle = [NSBundle bundleForClass:self];
當(dāng)前類的路徑

添加圖片資源,應(yīng)該放到組件內(nèi)部
先把a(bǔ)ssert里面的圖片拿出來,github上面cartool放入輸入和輸出路徑來破解出來;放到開發(fā)組件Classes同級的asserts里面
修改podspec文件。描述

s.resource_bundles = {
     'XMGFMMain' => ['XMGFMMain/Assets/*']
   }

這樣還不能直接使用,因為放到這個文件夾里面之后,最終打包成一個資源包。這個放到項目名.framework里面
使用圖片的時候xib里面用 項目名.framework/圖片名
代碼里面加載,不能直接使用imageNamed方法,要使用


    // 設(shè)置tabbar 背景圖片
    // car, mainBundle
    NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];  
    NSString *imagePath = [currentBundle pathForResource:@"tabbar_bg@2x.png" ofType:nil inDirectory:@"XMGFMMain.bundle"];
    UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
    self.backgroundImage = image;

私有庫資源依賴

有時候我們自己寫的庫需要依賴圖片、xib、 storyboard等資源
我們最終要達(dá)到目的是 宿主工程里面只集成業(yè)務(wù)組件

添加開發(fā)的庫.png

添加完之后項目結(jié)構(gòu)

然后在終端,執(zhí)行一下 pod install 就把本地庫引入了我們的項目,因為我們引入的時候沒有選擇,copy item if needed。所以項目中只是對文件的引用,我們這樣就可以邊開發(fā)邊測試了,等開發(fā)功能差不多的時候,就可以進(jìn)行下一步了。

在代碼托管平臺創(chuàng)建我們的托管項目

創(chuàng)建的時候注意,不要勾選,readeMe和gitignore,因為我們上一步創(chuàng)建出來的項目里面自帶這兩個文件。如果遠(yuǎn)程又創(chuàng)建了會產(chǎn)生沖突,


創(chuàng)建遠(yuǎn)程代碼管理

創(chuàng)建完之后,會有一個url用來cloning的
然后找到url更改我們本地代碼的.podspec文件的里面一些配置

#核心代碼所在的位置
  s.source_files = 'HomeKit/Classes/**/*'

默認(rèn)當(dāng)前文件在哪里,他就是找到當(dāng)前文件的目錄下面,因為 HomeKit跟。podspec文件在同一級目錄,所以不需要,跳轉(zhuǎn)文件夾
/**他會找當(dāng)前文件夾里面的所有文件,不寫的話他只會查找一層

之后開發(fā)更新,版本號也是需要更改的。每次更新版本都需要更改,注意跟tag保持一致

  s.version          = '0.1.0'

因為Cocoapod是根據(jù)tag去索引代碼的,git的tag。如果沒有寫的話是不能下載的,
創(chuàng)建好遠(yuǎn)程的代碼庫,然后將.podspec里面source改成創(chuàng)建好的遠(yuǎn)程地址

  s.source   = { :git => '創(chuàng)建好的遠(yuǎn)程代碼托管url', :tag => s.version.to_s }
  • 當(dāng)我們的代碼運(yùn)行沒有錯誤之后,我們就可以添加到遠(yuǎn)程代碼倉庫了
  • 總體來講的話,使用終端操作git管理代碼有這么幾個主要步驟
    先查看文件的狀態(tài)
    git status
  1. 把文件添加到本地暫緩區(qū)
    git add .
  2. 把文件添加到本地代碼倉庫
    git commit 文件名
  3. 建立本地倉庫與遠(yuǎn)程代碼倉庫之間的連接
    先查看是不是有遠(yuǎn)程的代碼倉庫
    git remote
    如果沒有的話手動添加關(guān)聯(lián)
    git remote add origin 遠(yuǎn)程倉庫url
  4. 把本地代碼提交到遠(yuǎn)程代碼倉庫
    git push origin master
  5. 添加tag,這里面的tag要跟.podspec里面的version保持一致
    git tag -a 0.1.0 -m '描述文字'
  6. 把tag推送到遠(yuǎn)程代碼倉庫
    git push --tags
  • 將我們的組建添加到pod庫里面,這里需要穿我們自己私有的庫名還有組建的podspec文件全稱
pod repo push  HLPrivateStore  HomeKit.podspec

執(zhí)行這句可能會產(chǎn)生警告,這時候我們可以忽略警告,可以在后面加上 一句

pod repo push  HLPrivateStore  HomeKit.podspec --allow-warnings
 

當(dāng)執(zhí)行完這部我們用pod search來搜索一下看看有沒有我們的庫,如果有就可以使用了。注意,要在podfile文件里面加上一句

source '本地庫的url '

因為他默認(rèn)會從公有庫里尋找,

  • 注意以后我們更新我們的庫的話 需要更改podspec。里面的version
    還要重新設(shè)置git的tag

劃分子組件

如果我們的組件中用到了太了文件和一些共有的工具類,我們可以將它們劃分成一個個子組件,這樣當(dāng)我們使用的時候,在工程里面就可以很清晰的辨別文件的類型

s.subspec   'Frame' do |frame|  
#兩個frame的名字不能一樣不然會出錯,第二個只是一個變量名字,用來在在這個區(qū)間使用
frame.source_files = 'HomeKit/Classes/Frame/*.{h, m}'
end

因為我們沒有改代碼,所有子需要重新覆蓋一下本地的podspec文件就好了

pod repo push  HLPrivateStore  HomeKit.podspec --allow-warnings

因為我們剛剛更新了spec的文件,劃分了文件結(jié)構(gòu),所以我們引用的項目,重新pod update一下

這時候我們引用的地方可能會出現(xiàn),劃分的文件夾,但是里面沒有文件,文件還是在外面,這是因為我們那有引用全部文件s.source_files = 'HomeKit/Classes/**/*'這句代碼,所以我們要把這句話注釋掉,就可以了

組件加載資源文件(圖片 xib storybord)

在 .podspec文件里面更改

s.resource_bundles = {
    'HLCategory' => ['HLCategory/Assets/*.png', 'HLCategory/Classes/**/*.xib']
   }

 s.resource_bundles = {
    'SHLLiveKit' => ['SHLLiveKit/Classes/**/*.{storyboard,xib}']
  }

當(dāng)我們在使用 我們框架里面的圖片資源的時候,要記得加上bundle的名字,因為Xcode會將我們的資源壓縮到我們框架的bundle里面,它本身不是mainBundle里面的資源,所以不能直接使用,圖片名字

使用非cocoaPods庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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