(原創(chuàng))組件化:發(fā)布CocoaPods私有/公有庫(kù)

文章目錄

簡(jiǎn)書(shū)的目錄跳轉(zhuǎn)還在研究中...

  1. 什么是CocoaPods壹瘟?
    • CocoaPods的核心組件
  2. podspec文件鳄逾?
    • podspec是如何下載資源文件雕凹?
    • 如何創(chuàng)建podspec文件政冻?
    • podspec如何編輯线欲?
      • 如何做文件夾層級(jí)李丰?
      • 如何關(guān)聯(lián)資源文件?
      • 編寫(xiě)swift版本庫(kù)注意事項(xiàng)
  3. podspec準(zhǔn)備就緒,如何發(fā)布出去呢舟舒?
    • 發(fā)布公有庫(kù)
    • 發(fā)布私有庫(kù)
  4. 發(fā)布完成去使用
    • 發(fā)布完搜索不到怎么辦嗜憔?
    • 搜索到?jīng)]法下載如何是好吉捶?
  5. 常見(jiàn)發(fā)布問(wèn)題

什么是CocoaPods?

CocoaPods 是開(kāi)發(fā) OS X 和 iOS 應(yīng)用程序的一個(gè)第三方庫(kù)的依賴(lài)管理工具谣旁。利用 CocoaPods床佳,可以定義自己的依賴(lài)關(guān)系 (稱(chēng)作pods)滋早,并且隨著時(shí)間的變化砌们,以及在整個(gè)開(kāi)發(fā)環(huán)境中對(duì)第三方庫(kù)的版本管理非常方便。
CocoaPods 背后的理念主要體現(xiàn)在兩個(gè)方面昔头。首先揭斧,在工程中引入第三方代碼會(huì)涉及到許多內(nèi)容峻堰。針對(duì) Objective-C 初級(jí)開(kāi)發(fā)者來(lái)說(shuō)捐名,工程文件的配置會(huì)讓人很沮喪。在配置 build phases 和 linker flags 過(guò)程中成艘,會(huì)引起許多人為因素的錯(cuò)誤。CocoaPods 簡(jiǎn)化了這一切断箫,它能夠自動(dòng)配置編譯選項(xiàng)瑰枫。
其次丹莲,通過(guò) CocoaPods甥材,可以很方便的查找到新的第三方庫(kù)洲赵。當(dāng)然,這并不是說(shuō)你可以簡(jiǎn)單的將別人提供的庫(kù)拿來(lái)拼湊成一個(gè)應(yīng)用程序芝发。它的真正作用是讓你能夠找到真正好用的庫(kù)辅鲸,以此來(lái)縮短我們的開(kāi)發(fā)周期和提升軟件的質(zhì)量腹殿。
CocoaPods是用 Ruby 寫(xiě)的锣尉,并由若干個(gè) Ruby 包 (gems) 構(gòu)成的。在解析整合過(guò)程中坟奥,最重要的幾個(gè) gems 分別是:CocoaPods/CocoaPods,CocoaPods/Core, 和CocoaPods/Xcodeproj(是的爱谁,CocoaPods 是一個(gè)依賴(lài)管理工具 -- 利用依賴(lài)管理進(jìn)行構(gòu)建的旺嬉!)邪媳。
編者注CocoaPods 是一個(gè) objc 的依賴(lài)管理工具,而其本身是利用 ruby 的依賴(lài)管理 gem 進(jìn)行構(gòu)建的迅涮。

CocoaPods的核心組件
組件 說(shuō)明
CocoaPods/CocoaPod 這是是一個(gè)面向用戶(hù)的組件叮姑,每當(dāng)執(zhí)行一個(gè)pod命令時(shí)传透,這個(gè)組件都將被激活。該組件包括了所有使用 CocoaPods 涉及到的功能群嗤,并且還能通過(guò)調(diào)用所有其它的 gems 來(lái)執(zhí)行任務(wù)
CocoaPods/Core Core 組件提供支持與 CocoaPods 相關(guān)文件的處理狂秘,文件主要是 Podfile 和 podspecs
Podfile Podfile 是一個(gè)文件躯肌,用于定義項(xiàng)目所需要使用的第三方庫(kù)清女。該文件支持高度定制校仑,你可以根據(jù)個(gè)人喜好對(duì)其做出定制传惠。更多相關(guān)信息卦方,請(qǐng)查閱Podfile 指南
CocoaPods/Xcodeproj 這個(gè) gem 組件負(fù)責(zé)所有工程文件的整合盼砍。它能夠?qū)?chuàng)建并修改.xcodeproj和.xcworkspace文件。它也可以作為單獨(dú)的一個(gè) gem 包使用睬捶。如果你想要寫(xiě)一個(gè)腳本來(lái)方便的修改工程文件擒贸,那么可以使用這個(gè) gem
Manifest.lock 這是每次運(yùn)行pod install命令時(shí)創(chuàng)建的Podfile.lock文件的副本。如果你遇見(jiàn)過(guò)這樣的錯(cuò)誤沙盒文件與 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock)徽惋,這是因?yàn)?Manifest.lock 文件和Podfile.lock文件不一致所引起险绘。由于Pods所在的目錄并不總在版本控制之下宦棺,這樣可以保證開(kāi)發(fā)者運(yùn)行 app 之前都能更新他們的 pods黔帕,否則 app 可能會(huì) crash蹬屹,或者在一些不太明顯的地方編譯失敗
xcproj 如果你已經(jīng)依照我們的建議在系統(tǒng)上安裝了xcproj,它會(huì)對(duì)Pods.xcodeproj文件執(zhí)行一下touch以將其轉(zhuǎn)換成為舊的 ASCII plist 格式的文件贩耐。為什么要這么做呢潮太?雖然在很久以前就不被其它軟件支持了铡买,但是 Xcode 仍然依賴(lài)于這種格式霎箍。如果沒(méi)有 xcproj漂坏,你的Pods.xcodeproj文件將會(huì)以 XML 格式的 plist 文件存儲(chǔ),當(dāng)你用 Xcode 打開(kāi)它時(shí)谷徙,它會(huì)被改寫(xiě)完慧,并造成大量的文件改動(dòng)
Podfile.lock 這是 CocoaPods 創(chuàng)建的最重要的文件之一屈尼。它記錄了需要被安裝的 pod 的每個(gè)已安裝的版本。如果你想知道已安裝的 pod 是哪個(gè)版本指蚜,可以查看這個(gè)文件。推薦將 Podfile.lock 文件加入到版本控制中贡羔,這有助于整個(gè)團(tuán)隊(duì)的一致性
Podspec .podspec也是一個(gè)文件,該文件描述了一個(gè)庫(kù)是怎樣被添加到工程中的。它支持的功能有:列出源文件、framework锨苏、編譯選項(xiàng)和某個(gè)庫(kù)所需要的依賴(lài)等
關(guān)于podfile指定版本的說(shuō)明
版本 說(shuō)明
pod ‘Alamofire’ 不指定依賴(lài)庫(kù)版本伞租,表示每次都獲取最新版本
pod ‘Alamofire’, ‘2.0’ 只使用2.0版本
pod ‘Alamofire’, ‘> 2.0’ 使用高于2.0的版本
pod ‘Alamofire’, ‘>= 2.0’ 使用大于或等于2.0的版本
pod ‘Alamofire’, ‘< 2.0’ 使用小于2.0的版本
pod ‘Alamofire’, ‘<= 2.0’ 使用小于或等于2.0的版本
pod ‘Alamofire’, ‘~> 0.1.2’ 使用大于等于0.1.2但小于0.2的版本
pod ‘Alamofire’, ‘~>0.1’ 使用大于等于0.1但小于1.0的版本
pod ‘Alamofire’, ‘~>0’ 高于0的版本葵诈,等同于表示每次都獲取最新版本

podspec文件

一. 什么是podspec文件作喘?

  • podspec中spec的全稱(chēng)是“Specification”晕城,說(shuō)明書(shū)的意思广辰。顧名思義择吊,這是用來(lái)描述這個(gè)庫(kù)說(shuō)明信息的文件槽奕。
  • podspec是cocoaPods的一種文件格式粤攒,有一套自己的語(yǔ)法,我們可以到cocoaPods官網(wǎng)進(jìn)行詳細(xì)了解焕济。
  • podspec描述了一個(gè)pod庫(kù)的版本晴弃。它包括有關(guān)應(yīng)從何處獲取源上鞠、使用什么文件、應(yīng)用的構(gòu)建設(shè)置以及其他一般元數(shù)據(jù)(如其名稱(chēng)世曾、版本和描述)的詳細(xì)信息轮听。
1. cocoapods是如何通過(guò)podspec下載資源文件蕊程?

podspec 管理幾個(gè)重要信息
文件源所在git地址,源文件所在git地址的文件路徑,源文件對(duì)應(yīng)的tag值
通過(guò)以上三個(gè)內(nèi)容藻茂,就精準(zhǔn)的掌握了資源文件
然后通過(guò)下面的命令即可下載想要的資源玫恳。

  • pod install
    當(dāng)我們新建一個(gè)Podfile文件運(yùn)行后京办,會(huì)自動(dòng)生成一個(gè)Podfile.lock文件惭婿,Podfile.lock文件里存儲(chǔ)著我們已經(jīng)安裝的依賴(lài)庫(kù)(pods)的版本。
    當(dāng)我們第一次運(yùn)行Podfile時(shí)换吧,如果對(duì)依賴(lài)庫(kù)不指定版本的話沾瓦,cocoapods會(huì)安裝最新的版本贯莺,同時(shí)將pods的版本記錄在Podfile.lock文件中。這個(gè)文件會(huì)保持對(duì)每個(gè)pod已安裝版本的跟蹤魂莫,并且鎖定這些版本耙考。
    再執(zhí)行pod install的話琳骡,只會(huì)處理沒(méi)有記錄在Podfile.lock中的依賴(lài)庫(kù)楣号,會(huì)查找匹配Podfile中描述的版本怒坯。對(duì)于已經(jīng)記錄在Podfile.lock的依賴(lài)庫(kù)剔猿,會(huì)下載Podfile.lock文件中記錄的版本归敬,而不會(huì)檢查是否有更新。當(dāng)然椅亚,如果你約束了pods的版本的話呀舔,會(huì)按照你指定的版本進(jìn)行安裝媚赖,同時(shí)也會(huì)更新Podfile.lock記錄的信息珠插。
    簡(jiǎn)單的說(shuō):使用pod install在你的工程里安裝新的pods丧失。盡管你已經(jīng)有了一個(gè)Podfile并且之前運(yùn)行過(guò)pod install布讹;盡管你只是在已經(jīng)使用了CocoaPods的工程中添加/移除了pod描验,你都要使用pod instal

  • pod outdated
    檢查記錄在Podfile.lock文件中的pod版本更新情況膘流。
    當(dāng)你運(yùn)行pod outdated命令,CocoaPods會(huì)列出所有有新版本的pods耕魄,新版本是指比記錄在Podfile.lock文件中的版本(即當(dāng)前每個(gè)pod安裝的版本)更新的版本吸奴。這意味著如果你對(duì)這些pod運(yùn)行pod update PODNAME则奥,它們將會(huì)更新狭园。

  • pod update
    推薦用法:pod update + podName
    當(dāng)你運(yùn)行pod update podName命令唱矛,CocoaPods將會(huì)嘗試找到PODNAME指定pod的更新版本绎谦,而不會(huì)顧及Podfile.lock文件中記錄的版本燥滑。它將會(huì)更新pod的最新可用版本.如果你運(yùn)行pod update而不帶pod名稱(chēng)铭拧,CocoaPods將會(huì)更新Podfile文件中記錄的每一個(gè)pod到最新可用版本.
    簡(jiǎn)單的說(shuō):只有在你想要更新pods到新的版本時(shí)才使用pod update podName

  • 更新緩慢 ?
    最近使用CocoaPods來(lái)添加第三方類(lèi)庫(kù)搀菩,無(wú)論是執(zhí)行pod install還是pod update都卡在了Analyzing dependencies不動(dòng). 原因在于當(dāng)執(zhí)行以上兩個(gè)命令的時(shí)候會(huì)升級(jí)CocoaPods的spec倉(cāng)庫(kù)肪跋,加一個(gè)參數(shù)可以省略這一步,然后速度就會(huì)提升不少萝映。加參數(shù)的命令如下:
    pod install --verbose --no-repo-update
    pod update --verbose --no-repo-update
    但這樣處理序臂,我額外發(fā)現(xiàn)了一個(gè)弊端:
    就是當(dāng)你搜索一個(gè)庫(kù)時(shí)奥秆,往往搜出來(lái)不是最新的版本.請(qǐng)自行更新构订。
    --no-repo-update 不更新本地的倉(cāng)庫(kù)避矢,直接更新源谷异。
    --verbose輸出詳細(xì)日志信息

  • 明明線上有這個(gè)庫(kù)歹嘹,但是pod search podName卻搜索不到尺上?
    open ~/Library/Caches/CocoaPods 刪除該目錄下的search_index.json文件怎抛。
    本地會(huì)保存一個(gè)repo鏡像马绝,search操作只是為了方便會(huì)到本地去檢索,對(duì)應(yīng)的應(yīng)該會(huì)有個(gè)策略掷邦,看起來(lái)應(yīng)該就是緩存里這個(gè)plist了抚岗,以后如果repos更新了宣蔚,plist里面沒(méi)有更新胚委,那么就會(huì)有問(wèn)題了篷扩。

2. 如何創(chuàng)建podspec文件鉴未?

說(shuō)一個(gè)最簡(jiǎn)單最實(shí)用的方法 通過(guò)pod lib create + 名字 來(lái)創(chuàng)建

創(chuàng)建步驟

代碼和資源在創(chuàng)建的項(xiàng)目中的pods -> Development Pods中編寫(xiě)铜秆。


代碼位置

說(shuō)明1: 用該方法創(chuàng)建的項(xiàng)目连茧,默認(rèn)遵守了MIT License協(xié)議
說(shuō)明2: 注意層級(jí)啸驯,podfile文件在Example文件夾下罚斗,podspec文件在項(xiàng)目根目錄下

3. podspec如何編輯针姿?

podspec文件關(guān)鍵字說(shuō)明

#  基本信息的配置
name:框架名
version:當(dāng)前版本(注意距淫,是當(dāng)前版本,假如你后續(xù)更新了新版本婶希,需要修改此處)
summary:簡(jiǎn)要描述榕暇,在pod search的時(shí)候會(huì)顯示該信息。
description:詳細(xì)描述
homepage:頁(yè)面鏈接
license:開(kāi)源協(xié)議
author:作者
platform:支持最低ios版本
swift_version : swift對(duì)應(yīng)的版本

# 源文件的配置
source:源碼git地址
source_files:源文件(可以包含.h和.m)
subspec:子庫(kù)
public_header_files:頭文件(.h文件)
resource_bundles:資源文件(配置的文件會(huì)放到你自己指定的bundle中)

# 依賴(lài)的配置
frameworks:依賴(lài)的系統(tǒng)框架
vendored_frameworks:依賴(lài)的非系統(tǒng)框架
libraries:依賴(lài)的系統(tǒng)庫(kù)
vendored_libraries:依賴(lài)的非系統(tǒng)的靜態(tài)庫(kù)
dependency:依賴(lài)的三方庫(kù)

示例說(shuō)明

Pod::Spec.new do |s|
  s.name             = 'PodspecDemo'               #庫(kù)的名字
  s.version          = '0.0.1'                     #庫(kù)的版本號(hào)
  s.summary          = 'short description'         # 庫(kù)的簡(jiǎn)短描述信息
  s.homepage         = 'https://gitee.com/modularComponents/Tools'       #主頁(yè)地址
  s.license          = { :type => 'MIT', :file => 'LICENSE' }            #協(xié)議
  s.author           = { 'Mccc' => '562863544@qq.com' }                  #作者信息
  s.platform         = :ios, '8.0'                   #平臺(tái)                      
  s.ios.deployment_target = '8.0'                    #最低支持的target
  s.swift_version = '4.0'                            #支持的swift版本
  s.description      = 'long description'            #庫(kù)的詳細(xì)描述信息

  s.source           = { :git => 'https://gitee.com/PodspecDemo.git', :tag => s.version.to_s }   #資源的git地址和版本號(hào)
  s.source_files     = 'PodspecDemo/Classes/**/*'  # git地址下資源文件的路徑


# =======以下為可選 ===========
# 依賴(lài)
  s.dependency  'SnapKit'   #此庫(kù)需要依賴(lài)SnapKit

# 加載資源文件
  s.ios.resource_bundle = { 'ToolsModuleBundle' => 'ToolsModule/Assets/Home/**/*.{png,jpg}' }  #添加資源文件

  # 設(shè)置文件夾分層
  s.subspec 'compass' do |ss|
      ss.source_files = "ToolsModule/Classes/Home/compass/*.{h,m}"
  end
end

主要說(shuō)明幾個(gè)點(diǎn):

1). source_files
  • source_files 源碼倉(cāng)庫(kù)地址(s.source)下喻杈,資源文件(要提供給別人使用的所有文件)的路徑彤枢。

  • 文件路徑是以.podspec文件所在層級(jí)開(kāi)始的。

  • source_files寫(xiě)法說(shuō)明 (以物理路徑為準(zhǔn))
    way1:直接指定文件名 source_files = 'XXX/XXX/fileName.swift'
    way2:目錄下所有符合的文件 source_files = 'XXX/XXX/*.swift'
    way3: 指定文件夾下所有符合條件的文件source_files = 'XXX/XXX/**/*.{h,m}'
    way4: 指定文件夾下所有文件source_files = 'XXX/XXX/**/*' **/*表示XXX/XXX/目錄及其子目錄下所有文件

    **表示匹配該目錄以及所有子目錄堂污,*.png表示所有以.png為擴(kuò)展名的圖片文件。

2). dependency 依賴(lài)三方的配置
  • 依賴(lài)公共庫(kù)龄砰。
    s.dependency 'SnapKit' #當(dāng)前依賴(lài)庫(kù),pod install時(shí)會(huì)自動(dòng)下載該庫(kù)(注意:沒(méi)有=
  • 依賴(lài)私有庫(kù)盟猖。
    s.dependency 'MCPageViewController'
    需要在podfile文件中指定存放podspec文件的倉(cāng)庫(kù)地址(包括公有庫(kù))
source 'https://github.com/CocoaPods/Specs.git'        #官方倉(cāng)庫(kù)地址
source 'https://gitee.com/mancong/MyPublicRepo.git'    #私有倉(cāng)庫(kù)地址
  • 如果有依賴(lài)私有庫(kù)情況讨衣,檢驗(yàn)podspec文件不通過(guò)的情況。請(qǐng)使用:
    pod spec lint --sources='spec倉(cāng)庫(kù)的地址 如有多個(gè)用,隔開(kāi)式镐。如果公有庫(kù)反镇,地址寫(xiě)https://github.com/CocoaPods/Specs.git
    比如依賴(lài)了兩個(gè)庫(kù)MCPageViewController (私有)SnapKit (共有)
    pod spec lint --sources='https://github.com/mancongiOS/MCPageViewControllerRepo.git,https://github.com/CocoaPods/Specs.git' --allow-warnings
    
    --sources : 指定文件源
    --allow-warnings : 允許源文件中有警告的存在

因?yàn)镃ocoaPods會(huì)默認(rèn)是官方地址下查找資源。但是私有庫(kù)資源不在官方地址下的娘汞,所以要指定源地址歹茶。

3). 如何做文件夾層級(jí)?
  s.subspec 'LevelDevice' do |ss|
      ss.source_files = "ToolsModule/Classes/Home/LevelDevice/*.{h,m}"
      ss.dependency 'ToolsModule/compass'  #依賴(lài)本庫(kù)的其他子庫(kù)
  end

子庫(kù)的依賴(lài)是獨(dú)立的你弦,如果父庫(kù)已經(jīng)依賴(lài)了惊豺,子庫(kù)可以不必依賴(lài)。注意依賴(lài)其他子subspec的情況禽作,具體看上面提供的podspec示例文件

4). 如何關(guān)聯(lián)資源文件?

因?yàn)橘Y源不在主命名空間下尸昧,所以需要特別處理一下。

  • 先將資源打包為Bundle
   s.ios.resource_bundle = { 'ToolsModuleBundle' => 'ToolsModule/Assets/Home/**/*.{png,jpg}' }

ToolsModuleBundle是自己命名的bundle名稱(chēng)旷偿。提交后會(huì)自動(dòng)生成一個(gè) Resources文件夾烹俗,里面包含了資源文件。

  • 如何在不同命名空間下加載
    資源以及打包成一個(gè)bundle了萍程,如何在pods庫(kù)中使用呢幢妄?
@objc extension Bundle {
    
    /**
     * 加載指定bundle下的圖片資源
     * 在哪個(gè)pod下的哪個(gè)bundle下的image
     */
    public static func mc_loadImage(_ imageName: String, from bundleName: String, in podName: String) -> UIImage? {
        
        
        var associateBundleURL = Bundle.main.url(forResource: "Frameworks", withExtension: nil)
        associateBundleURL = associateBundleURL?.appendingPathComponent(podName)
        associateBundleURL = associateBundleURL?.appendingPathExtension("framework")
        
        
        if associateBundleURL == nil {
            print("獲取bundle失敗")
            return nil
        }
        
        let associateBunle = Bundle.init(url: associateBundleURL!)
        associateBundleURL = associateBunle?.url(forResource: bundleName, withExtension: "bundle")
        
        if associateBundleURL != nil {
            let bundle = Bundle.init(url: associateBundleURL!)
            let scale = Int(UIScreen.main.scale)
            
            // 適配2x還是3x圖片
            let name = imageName + "@" + String(scale) + "x"
            let path = bundle?.path(forResource: name, ofType: "png")
            
            if path == nil {
                print("獲取bundle失敗")
                return nil
            }
            let image1 = UIImage.init(contentsOfFile: path!)
            return image1

        } else {
            return nil
        }
    }
}

// 使用
 let image1 = Bundle.mc_loadImage("圖片名", from: "命名的bundle名字", in: "庫(kù)名字")
5). 編寫(xiě)swift版本庫(kù)注意事項(xiàng)
  • 配置swift的版本
    s.swift_version = '4.0' 因?yàn)椴煌姹緦?duì)應(yīng)不同的swift方法。比如privite這個(gè)作用域修飾詞3.0上就沒(méi)有茫负。
  • 配置iOS的部署版本
    s.ios.deployment_target = '8.0'
  • 給swift文件中的類(lèi)名和方法添加作用域修飾詞
    需要給類(lèi)加上修飾詞蕉鸳,只允許訪問(wèn)不能繼承就用public,如何允許繼承就用open修飾,不允許被繼承就用public修飾朽褪。如果不用這兩個(gè)關(guān)鍵詞修飾的類(lèi)或者方法置吓,都不會(huì)被其他module訪問(wèn)到。
6). 如何校驗(yàn)podspec文件
  • pod lib lint
    只從本地驗(yàn)證你的pod能否通過(guò)驗(yàn)證缔赠。
  • pod spec lint
    從本地和遠(yuǎn)程驗(yàn)證你的pod能否通過(guò)驗(yàn)證衍锚,建議使用這個(gè)。
  • --use-libraries
    依賴(lài)庫(kù)(s.dependency)中 如果包含.a文件嗤堰,驗(yàn)證的時(shí)候出現(xiàn)錯(cuò)誤戴质。加上這個(gè)來(lái)讓驗(yàn)證通過(guò)。
  • --allow-warnings
    如何庫(kù)代碼中有警告導(dǎo)致通不過(guò)驗(yàn)證踢匣。加上這個(gè)忽略警告
  • 私有庫(kù)的驗(yàn)證
    使用pod spec lint去驗(yàn)證私有庫(kù)能否通過(guò)驗(yàn)證時(shí)應(yīng)該告匠,應(yīng)該要添加--sources并在podfile文件中指定repo的地址,不然會(huì)出現(xiàn)找不到repo的錯(cuò)誤离唬。
    pod spec lint --sources='私有倉(cāng)庫(kù)repo地址1,私有倉(cāng)庫(kù)repo地址1,公有庫(kù)的地址'
    用英文逗號(hào)隔開(kāi) 后专,公有庫(kù)地址為:https://github.com/CocoaPods/Specs repo的地址為存放podspec文件的倉(cāng)庫(kù)podfile文件中指定repo地址

podspec準(zhǔn)備就緒输莺,如何發(fā)布出去呢戚哎?

1. 為什么要發(fā)布podspec文件裸诽?

我們已經(jīng)將代碼源用podspec文件管理起來(lái)了。要讓其他人能下載使用你的代碼型凳,就要讓他找到podspec文件丈冬,所以我們要講podspec文件放在網(wǎng)絡(luò)上托管起來(lái)。

  • 公有庫(kù):將podspec放在cocoPods官方提供的倉(cāng)庫(kù)https://github.com/CocoaPods/Specs.git上托管
  • 私有庫(kù): 將podspec放在個(gè)人或者公司git倉(cāng)庫(kù)托管甘畅。

ps: 也就是說(shuō)埂蕊,一份庫(kù),需要兩個(gè)git倉(cāng)庫(kù)來(lái)托管疏唾,一個(gè)是代碼源的倉(cāng)庫(kù)蓄氧,一個(gè)是podspec的倉(cāng)庫(kù)

3. 發(fā)布前的準(zhǔn)備。
  • 在Example目錄下荸实,pod install一下匀们。
  • 回到根目錄(podspec所在層級(jí)目錄),對(duì)podspec文件進(jìn)行校驗(yàn)。
  • 正常提交代碼并打上標(biāo)簽准给。
// Example目錄下
pod install

// 回到項(xiàng)目根目錄下
git add -A
git commit -m "此次內(nèi)容"
git push
git tag 0.0.1
git push origin --tags

發(fā)布前的準(zhǔn)備工作完成。

2. 發(fā)布podspec文件到公有庫(kù)中
  • 注冊(cè)cocoaPods
終端執(zhí)行:$ pod trunk register 郵箱地址 '用戶(hù)名' --verbose

這里我們一般使用github郵箱和用戶(hù)名, 然后在你的郵箱中會(huì)收到確認(rèn)郵件, 在瀏覽器中點(diǎn)擊鏈接確認(rèn)即注冊(cè)成功重抖;

  • 驗(yàn)證cocoaPods
    確保打開(kāi)了郵件中的鏈接之后(正常加載出來(lái)就行)露氮,繼續(xù)執(zhí)行命令
 終端執(zhí)行:  $ pod trunk me
  • 發(fā)布
 終端執(zhí)行:  $ pod trunk push XXX.podspec

該命令執(zhí)行的過(guò)程

a.更新本地 pods庫(kù) ~/.cocoaPods.repo/master
b.驗(yàn)證*.podspec格式是否正確
c.將 *.podspec 文件轉(zhuǎn)成 JSON 格式
d.對(duì) master 倉(cāng)庫(kù)進(jìn)行合并、提交
  • 完成發(fā)布操作
    發(fā)布成功钟沛,會(huì)有成功的提示(包含:日期畔规,鏈接,Tell your friends)恨统。
3. 發(fā)布私有庫(kù)
  • 創(chuàng)建配置倉(cāng)(用來(lái)存儲(chǔ)代碼的podspec文件叁扫,即上面創(chuàng)建的podspec文件)。創(chuàng)建時(shí)別忘記選擇MIT License許可證畜埋。

  • 將配置倉(cāng)鏈接到本地repo
    pod repo add 配置倉(cāng)名(自己起的倉(cāng)庫(kù)名字) 配置倉(cāng)地址(倉(cāng)庫(kù)的git地址)
    示例: pod repo add MCCCSpec https://github.com/mancongiOS/MCCCCSpec.git
    說(shuō)明:此命令在新開(kāi)的終端中執(zhí)行莫绣,用完即可關(guān)閉

  • 發(fā)布私有庫(kù)
    pod repo push 項(xiàng)目配置庫(kù)名 項(xiàng)目代碼庫(kù).podspec
    示例:pod repo push MCCCSpec MCCC.podspec
    說(shuō)明:此命令在原終端中執(zhí)行,即podspec同級(jí)路徑下

  • 發(fā)布完成
    發(fā)布完成的提示
  • 附錄: 查看repos文件夾
    open ~/.cocoapods/repos

    repos

    master對(duì)應(yīng)的公有庫(kù)版本信息
    非master對(duì)應(yīng)的是私有庫(kù)版本信息

發(fā)布完成去使用

  1. pod search + 庫(kù)名
    如何搜索不到悠鞍,請(qǐng)更新本地庫(kù)的索引文件对室。
    open ~/Library/Caches/CocoaPods 刪除該目錄下的search_index.json文件。
    本地會(huì)保存一個(gè)repo鏡像咖祭,search操作只是為了方便會(huì)到本地去檢索掩宜,對(duì)應(yīng)的應(yīng)該會(huì)有個(gè)策略,看起來(lái)應(yīng)該就是緩存里這個(gè)plist了么翰,以后如果repos更新了牺汤,plist里面沒(méi)有更新,那么就搜索不到浩嫌。
  2. podfile中使用 pod 'MCPageViewController' 報(bào)錯(cuò)
    在podfile文件中添加資源文件路徑
source 'https://github.com/CocoaPods/Specs.git'        #官方倉(cāng)庫(kù)地址
source ‘https://github.com/mancongiOS/MCPageViewControllerRepo.git’ #私有倉(cāng)庫(kù)地址
  1. pod install時(shí)報(bào)錯(cuò)版本信息錯(cuò)誤
    更新版本 pod update 庫(kù)名pod repo update(不推薦使用檐迟,會(huì)更新所有的第三方庫(kù))

常見(jiàn)發(fā)布問(wèn)題

  1. [!] The repoMyPublicRepoat ../../../.cocoapods/repos/MyPublicRepo is not clean
    解決辦法
 方法1:
 cd ~/.cocoapods/repos
 cd MyRepo(報(bào)錯(cuò)的庫(kù)名字)
 git clean -f
 方法2:
 pod repo update MyRepo

如果還不可以那么先刪除原有的版本庫(kù)再重新安裝版本庫(kù)戴已,然后執(zhí)行更新命令

 pod repo remove MyRepo
 pod repo add MyRepo https://xxx.git 
 pod repo push MyRepo XXX.podspec

聯(lián)系作者

QQ群: 316879774

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锅减,隨后出現(xiàn)的幾起案子糖儡,更是在濱河造成了極大的恐慌,老刑警劉巖怔匣,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件握联,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡每瞒,警方通過(guò)查閱死者的電腦和手機(jī)金闽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剿骨,“玉大人代芜,你說(shuō)我怎么就攤上這事∨ɡ” “怎么了挤庇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贷掖。 經(jīng)常有香客問(wèn)我嫡秕,道長(zhǎng),這世上最難降的妖魔是什么苹威? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任昆咽,我火速辦了婚禮,結(jié)果婚禮上牙甫,老公的妹妹穿的比我還像新娘掷酗。我一直安慰自己,他們只是感情好窟哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布泻轰。 她就那樣靜靜地躺著,像睡著了一般脏答。 火紅的嫁衣襯著肌膚如雪糕殉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天殖告,我揣著相機(jī)與錄音阿蝶,去河邊找鬼。 笑死黄绩,一個(gè)胖子當(dāng)著我的面吹牛羡洁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爽丹,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼筑煮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辛蚊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起真仲,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袋马,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秸应,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虑凛,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年软啼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桑谍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祸挪,死狀恐怖锣披,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贿条,我是刑警寧澤雹仿,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站闪唆,受9級(jí)特大地震影響盅粪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悄蕾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望础浮。 院中可真熱鬧帆调,春花似錦、人聲如沸豆同。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)影锈。三九已至芹务,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸭廷,已是汗流浹背枣抱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辆床,地道東北人佳晶。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像讼载,于是被迫代替她去往敵國(guó)和親轿秧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子中跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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