CocoaPods進階:詳解私有庫制作

一、前言

自己一直想用CocoaPods制作pod庫,在自己面試過程中也被面試官問到過組件化開發的概念,然爾自己那時也不是很了解,CocoaPods與組件化也息息相關,利用CocoaPods也便于維護pod組件,于是自己就決定學習用CocoaPods制作pod庫,下面就開始講解私有庫的制作過程吧。

二、目錄

  • 安裝CocoaPods
  • 創建遠程內部私有Spec Repo倉庫
  • 模板創建pod庫
  • 編輯***.podspec文件
  • 驗證本地是否通過
  • 關聯本地倉庫,并推送到遠程倉庫,打標簽
  • 推送***.podspec到遠程spec倉庫
  • 驗證遠程是否通過
  • 驗證私有倉庫是否可用,pod集成私有庫

安裝CocoaPods

首先要安裝CocoaPods,沒有安裝可以參考我的博客CocoaPods安裝與使用

創建遠程內部私有Spec Repo倉庫

這步自己采坑不少,一開始自己并不理解,不知到代碼倉庫和Spec Repo是需要分開存儲的。好了,不說自己經歷的曲折了,如果你還沒有創建遠程內部私有Spec Repo倉庫, 需要到Github,碼云或其他代碼托管平臺創建遠程倉庫, 之后將遠程倉庫克隆到本地,終端執行如下命令:

//這里可以用https或ssh地址方式克隆
pod repo add WBSpecs git@github.com:wenmobo/WBSpecs.git

克隆之后,本地cocoapods目錄如下:

[圖片上傳失敗...(image-1f8ed3-1585582297672)]

模板創建pod庫

  • 第二步:在本地任意一個文件夾下創建pod庫:

    pod lib create WBAvoidCrash
    

    之后控制臺輸出

    [圖片上傳失敗...(image-6a900c-1585582297672)]

    接著會需要回答一些問題:

    # 你想使用哪個平臺?
    1、What platform do you want to use?? [ iOS / macOS ]
    iOS
    # 庫語言選擇?
    2、What language do you want to use?? [ Swift / ObjC ]
    ObjC
    # 你要使用哪個測試框架?
    3、Which testing frameworks will you use? [ Specta / Kiwi / None ]
    None
    # 是否要UI測試?
    4、Would you like to do view based testing? [ Yes / No ]
    NO
    # 類名前綴?
    5、What is your class prefix?
    WB
    

    成功之后,目錄如下:

    [圖片上傳失敗...(image-da3c7d-1585582297672)]

    工程目錄如下:

    [圖片上傳失敗...(image-28c98f-1585582297672)]

  • 在工程WBAvoidCrash目錄添加我們的代碼文件:

    [圖片上傳失敗...(image-46b0a5-1585582297672)]

    添加完成之后如下:

    [圖片上傳失敗...(image-fb161f-1585582297672)]

    注意:代碼文件需要添加到WBAvoidCrash/Classes目錄下。

編輯***.podspec文件

Pod::Spec.new do |s|
  #庫名稱
  s.name             = 'WBAvoidCrash'
  
  #指定支持的平臺和版本,不寫則默認支持所有的平臺,如果支持多個平臺,則使用下面的deployment_target定義
  spec.platform = :ios
  
  #版本號
  s.version          = '1.0.0'
  
  #庫簡短介紹
  s.summary          = 'iOS 防Crash庫'
  
  #開源庫描述 
  s.description      = ""
                       
  # 開源庫地址,或者是博客、社交地址等
  s.homepage         = 'https://github.com/wenmobo/WBAvoidCrash'
  
  # 開源協議
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  
  # 開源庫作者
  s.author           = { 'wenmobo' => 'wenmobo2018@gmail.com' }
  
  # 開源庫GitHub的路徑與tag值,GitHub路徑后必須有.git,tag實際就是上面的版本
  s.source           = { :git => 'https://github.com/wenmobo/WBAvoidCrash.git', :tag => s.version }
  
  # 社交網址
  s.social_media_url = 'http://blogwenbo.com/'
  
  # 開源庫最低支持
  s.ios.deployment_target = '8.0'
  
  # 源庫資源文件
  s.source_files = 'WBAvoidCrash/Classes/**/*'
  
  # 是否支持arc
  s.requires_arc = true
  
  # ---------------- Dependency --------------
  #開源庫依賴庫
  s.dependency "Masonry"
  # 指定版本
  s.dependency "Masonry", "~> 1.0"
  
  # ---------------- Project Linking ----------------
  # 添加系統依賴靜態庫
  s.library = 'sqlite3', 'xml2'
  
  #依賴系統庫
  s.frameworks = 'Foundation'
  
  #添加依賴第三方的framework
  s.vendored_frameworks = 'XXXX/XXXX/**/*.framework'
  
  #靜態庫.a
  s.vendored_library = 'XXXX/XXX/XXX.a', 'YYY/YYY/Y.a'
  
  # ---------------- Resource ------------------
  s.resource  = "icon.png"
  s.resources = "Resources/*.png"
  s.resource_bundles = {
   'ATCategory' => ['ATCategory/Images/*.png']
  }
  
  #添加資源文件
  s.resource = 'XXX/XXXX/**/*.bundle'
  
  # ---------------- Project Setting ----------------
  s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
  
  # pod工程配置,指模擬器指令集配置
  ss.pod_target_xcconfig = {
    'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
  }
  
  # 在 podspec 文件中添加 s.static_framework = true,CocoaPods 就會把這個庫配置成static framework。同時支持 Swift 和 Objective-C
  s.static_framework = true
  
  # ---------------- Subspec ----------------
  s.subspec 'sub' do |ss|
    ss.source_files = 'WBAvoidCrash/Classes/**/*'
  end
  
end
  • 關于s.source_files寫法
//表示匹配WBAvoidCrash/Classes下所有文件(主目錄和子目錄,其中**相當于省略中間層級)
'WBAvoidCrash/Classes/**/*'
//表示匹配Classes所有以.h和.m結尾的文件
'WBAvoidCrash/Classes/*.{h,m}'
//表示匹配所有WBAvoidCrash目錄下文件,不包含子目錄
'WBAvoidCrash/*'

更多關于資源目錄層級寫法可以參考GitHub一些著名框架,AFNetworking.podspecZFPlayer.podspec等。

  • s.dependency關于依賴三庫,依賴多個三方庫如下:

    s.dependency 'Masonry'
    s.dependency 'MJRefresh'
    s.dependency 'Masonry' 'YYModel'
    

驗證本地是否通過

  • 配置好podspec之后,驗證本地庫是否通過驗證,終端輸入如下命令:
pod lib lint

通過驗證,終端輸出如下:

[圖片上傳失敗...(image-7d62bf-1585582297672)]

  • 報如下錯誤
屏幕快照 2018-08-14 上午12.21.07.png

需在Xcode中配置:

屏幕快照 2018-08-14 上午12.34.17.png
  • 如果pod庫存在警告是不能通過驗證的,如果要暫時忽略警告通過驗證(如碼云創建的私有庫s.homepage地址不可達警告),可使用如下命令:
pod lib lint --allow-warnings
  • 你制作的pod庫依賴三方庫,而三方庫包含靜態庫(如:xxxx.a),在驗證的時候,不能驗證通過,可使用如下命令:

  • pod lib lint --use-libraries
    
    //同時忽略警告
    pod lib lint --use-libraries --allow-warnings
    

不管怎樣都要解決pod庫存在的警告,并通過驗證。

關聯本地倉庫,并推送到遠程倉庫,打標簽

  • 如果你還未創建遠程倉庫,你需要創建與之對應的遠程倉庫,我是在GitHub創建的倉庫,這里也不再贅述創建方法。創建之后須與本地倉庫關聯,在終端執行如下命令:
#提交代碼到暫存區
git add .
#提交到本地倉庫
git commit -m "create WBAvoidCrash Library"
#添加到遠程倉庫
git remote add origin git@github.com:wenmobo/WBAvoidCrash.git
#推送到遠程倉庫
git push origin master
  • 最近在用碼云制作私有庫的時候按照上面git命令,在執行git push origin master會報錯,需要執行以下命令或者按終端提示的信息操作,第一次才能成功推送到遠程倉庫:

  • git pull --rebase origin master
    
  • 提交完成之后進行打標簽操作:

#打標簽
git tag -a 1.0.0 -m 'release version 1.0.0'
#推送標簽到遠程
git push origin 1.0.0

友情提示

關于git打標簽操作,你可以借助Sourcetree或者終端命令,可以查看我的博客MAC上Git打標簽

推送***.podspec到遠程

首先將本地WBAvoidCrash.podspec推送到遠程私有repo spec倉庫和本地repo spec倉庫,終端執行如下命令:

cd [WBAvoidCrash庫路徑]
pod repo push WBSpecs WBAvoidCrash.podspec

[圖片上傳失敗...(image-f0bc8e-1585582297672)]

驗證遠程是否通過

推送成功之后,終端輸入如下命令進行驗證:

pod spec lint WBAvoidCrash.podspec

驗證通過終端輸出如下:

[圖片上傳失敗...(image-5274bf-1585582297672)]

  • 同樣這里如果還存在著警告或者錯誤,同樣不能驗證通過,同樣可以用以下命令忽略警告通過驗證:

    pod spec lint WBAvoidCrash.podspec --allow-warnings
    pod spec lint WBAvoidCrash.podspec --use-libraries
    pod spec lint WBAvoidCrash.podspec --allow-warnings --use-libraries
    

驗證私有倉庫是否可用,pod集成私有庫

驗證通過之后,下面進行測試,看是否能通過cocoapods集成到我們的項目,首先用pod命令進行搜索,看能否搜索到:

pod search WBAvoidCrash

這時可能會報如下錯誤

[圖片上傳失敗...(image-b4dc9a-1585582297672)]

不要慌,在終端執行如下命令,然后重新search:

rm ~/Library/Caches/CocoaPods/search_index.json

耐心等待之后,發現能搜到自己創建的私有庫了:

[圖片上傳失敗...(image-7a504d-1585582297672)]

新建一個測試工程測試,用CocoaPods初始化項目,編輯podfile文件:

#CocoaPods官方spec倉庫
source 'https://github.com/CocoaPods/Specs.git'
#自己私有spec倉庫
source 'https://github.com/wenmobo/WBSpecs.git'

platform :ios, '8.0'

target 'Test' do
  #防Crash庫
  pod 'WBAvoidCrash'

  # Pods for Test

  target 'TestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'TestUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

編輯好podfile文件之后,終端執行:

pod install
或
pod install --no-repo-update

耐心等待一會兒,你會發現私有庫已經集成到測試項目中了:

[圖片上傳失敗...(image-77cf4b-1585582297672)]

到這里,cocoapods私有庫制作已講解完成。也為自己制作的第一個私有庫打波廣告吧????,WBAvoidCrash一個防Crash庫,現在支持9種防崩潰類型,集成方便,使用無需導入相關的頭文件,這個庫之前沒這么完善,后來參考借鑒了一些大神開源的庫。下面??貼出私有庫地址吧:

WBAvoidCrash

三、相關命令

cocoapods

  • 查看所有repo

    pod repo list
    
  • 移除某個repo

    pod repo remove [spec]
    
  • 更新repo

    # 更新所有repo
    pod repo update
    # 更新指定
    pod repo update [spec庫名]
    
  • 驗證可選參數

    --quick                                Lint skips checks that would require
                                               to download and build the spec
    --allow-warnings                       Lint validates even if warnings are
                                         present
    --subspec=NAME                         Lint validates only the given subspec
    --no-subspecs                          Lint skips validation of subspecs
    --no-clean                             Lint leaves the build directory
                                         intact for inspection
    --fail-fast                            Lint stops on the first failing
                                         platform or subspec
    --use-libraries                        Lint uses static libraries to install
                                         the spec
    --use-modular-headers                  Lint uses modular headers during
                                         installation
    --sources=https://cdn.cocoapods.org/   The sources from which to pull
                                         dependent pods (defaults to
                                         https://cdn.cocoapods.org/). Multiple
                                         sources must be comma-delimited
    --platforms=ios,macos                  Lint against specific platforms
                                         (defaults to all platforms supported
                                         by the podspec). Multiple platforms
                                         must be comma-delimited
    --private                              Lint skips checks that apply only to
                                         public specs
    --swift-version=VERSION                The `SWIFT_VERSION` that should be
                                         used to lint the spec. This takes
                                         precedence over the Swift versions
                                         specified by the spec or a
                                         `.swift-version` file
    --include-podspecs=**/*.podspec        Additional ancillary podspecs which
                                         are used for linting via :path
    --external-podspecs=**/*.podspec       Additional ancillary podspecs which
                                         are used for linting via :podspec. If
                                         there are --include-podspecs, then
                                         these are removed from them
    --skip-import-validation               Lint skips validating that the pod
                                         can be imported
    --skip-tests                           Lint skips building and running tests
                                         during validation
    --analyze                              Validate with the Xcode Static
                                         Analysis tool
    --silent                               Show nothing
    --verbose                              Show more debugging information
    --no-ansi                              Show output without ANSI codes
    --help                                 Show help banner of specified command
    

    可通過如下命令查看可選參數

    pod lib lint --help
    
  • 驗證本地pod庫

    # 驗證本地pod庫
    pod lib lint
    # 本地驗證忽略警告
    pod lib lint --allow-warnings
    
  • 驗證遠程

    #驗證遠程
    pod spec lint [name].podspec
    
  • 搜索pod庫

    pod search [庫名]
    

四、問題解決

4.1、JPush制作私有庫lint時報錯 symbol(s) not found for architecture i386

valid_archs = ['armv7s','arm64',]
s.xcconfig = {
  'VALID_ARCHS' =>  valid_archs.join(' '),
}
s.pod_target_xcconfig = {
    'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
}

4.2、私有庫依賴私有庫驗證不通過

--sources=[private spec],[cocoapods spec]
# 如下寫法
pod lib lint --no-clean --sources=https://xxx.git,https://github.com/CocoaPods/Specs.git --allow-warnings --use-libraries --use-modular-headers --verbose

五、結語

終于完成這篇博客了,從自己比較熟悉GitHub之后,也想過自己能夠開源一款三方庫,然而自己水平有限,現在還沒有拿的出來好的封裝庫或一些好的封裝思想。但自己還是要學會制作pod庫,在寫博客之前,自己在谷歌瀏覽器查了許多的資料,資料也是比較的凌亂,自己在制作過程中也踩了許多的坑,最后自己也成功制作了一個私有庫WBAvoidCrash,過程雖然有些坎坷,但自己還是很有成就感。自己也是第一次制作,如果有描述不對的地方,希望大家能夠批評指正,我也會第一時間修改,同時也希望這篇博客對需要的朋友一些幫助,接下來我也會寫一篇記錄公開庫制作過程的博客。

六、參考文章

1、 CocoaPods創建公有和私有Pod庫方法總結
2、出現Unable to find a pod with name, author, summary, or description matching解決方法
3、如何發布自己的開源框架到CocoaPods
4、使用CocoaPods管理iOS庫---制作pod篇
5、如何創建私有 CocoaPods 倉庫
6、Making a CocoaPod
7、Create and Distribute Private Libraries with Cocoapods
8、CocoaPods使用總結

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容