天天看點

使用CocoaPods建立開源庫和私有庫詳解

筆者看了許多關于使用CocoaPods建立開源庫的文章,大都寫的不盡詳細,尤其是對于從來沒有建立過開源庫的同學,不知道哪個步驟文章沒寫,在驗證 .podspec 檔案時就一堆錯誤,一臉懵逼。本文是一篇從零開始建立一個自己的開源庫甚至是私有庫分享,如有問題,評論交流。

首先,你需要注冊一個CocoaPods賬号,email使用你的GitHub郵箱,起一個使用者名,打開終端:

pod trunk register GitHub_email 'user_name' --verbose
           

等終端出現下面文字,CocoaPods 會發一個确認郵件到你的郵箱,登入你的郵箱進行确認。

[!] Please verify the session by clicking the link in the verification email that has been sent to [email protected]
           

驗證成功出現下圖:

使用CocoaPods建立開源庫和私有庫詳解

回到終端:

pod trunk me
           

會看到你的注冊資訊:

使用CocoaPods建立開源庫和私有庫詳解

建立開源庫

首先建立Git遠端公有倉庫

使用CocoaPods建立開源庫和私有庫詳解

在你本地要建立項目的目錄執行

pod lib create 'ADTextFieldLimit'
           

根據指令行的提示一步步選擇,最後會為你建立一個模闆工程和.podspec檔案、README.md檔案、MIT LICENSE檔案等。 并且還會自動幫你打開Xcode,目錄結構如下:

使用CocoaPods建立開源庫和私有庫詳解

我們把要開源的核心代碼放在紅色區域所在的目錄下,此時通過Cocoapods建立出來的目錄在本地的Git管理下,我們需要把它添加到遠端倉庫:

git add .
git commit -m 'Initial Commit'
git remote add origin https://github.com/liushuorepo/ADTextFieldLimit.git	#添加遠端倉庫
git push origin master     #送出到遠端倉庫
           

此時項目已經被推到了遠端端,下面要做的就是修改.podspec檔案,配置成下面這樣:

Pod::Spec.new do |s|
  s.name             = 'ADTextFieldLimit'    #項目名稱
  s.version          = '0.0.1'          	 #版本号 與倉庫的标簽号對應
  s.summary          = 'This is a light library to limit the lenght of what you input.'  #項目簡介
  s.description      = <<-DESC
This is a light library to limit the lenght of what you input. Thankyou!
                       DESC
  s.homepage         = 'https://github.com/liushuorepo/ADTextFieldLimit'  #Git上項目首頁
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }  #開源證書
  s.author           = { 'liushuorepo' => '[email protected]' }     #項目作者
  s.source           = { :git => 'https://github.com/liushuorepo/ADTextFieldLimit.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
  s.ios.deployment_target = '9.0'
  s.source_files = 'ADTextFieldLimit/Classes/**/*'
  # s.resource_bundles = {
  #   'ADTextFieldLimit' => ['ADTextFieldLimit/Assets/*.png']
  # }
  # s.public_header_files = 'Pod/Classes/**/*.h'
  s.frameworks = 'UIKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end
           
  • s.source 指定源,你的Git倉庫位址
  • s.source_files 指明哪些源檔案會被包含進去,比如s.source_files =

    ‘ADTextFieldLimit/Classes*’,**表示比對所有子目錄,*表示比對所有檔案,.{h,m}表示比對其中的.h和.m檔案。

  • s.license,一般寫法有s.license = ‘MIT’ 或 s.license = { :type => ‘MIT’, :file => ‘LICENSE’ }, LICENSE對應.podspec所在目錄下的名為LICENSE檔案。
  • s.platform = :ios, “7.0”,s.ios.deployment_target = ‘7.0’,指定可用平台和版本,如果支援多個平台應該使用後者,并指定其他平台的版本如s.osx.deployment_target =“10.7”。
  • s.public_header_files,公開的頭檔案,如果指定,在pod lint驗證時,會以framework的形式驗證,一般可以不用這個配置。
  • s.frameworks、s.libraries,指定依賴的系統庫。兩者内容都需要去除字尾,其中s.libraries需要去除字首lib,如靜态庫依賴是libz.tbd,則s.libraries= ‘z’。
  • s.vendored_libraries 、s.vendored_frameworks 如果開源庫中是一個靜态庫,使用這個指定靜态庫。如微網誌的podspec中s.vendored_libraries = ‘libWeiboSDK/libWeiboSDK.a’
  • s.xcconfig 指定項目配置,如HEADER_SEARCH_PATHS 、OTHER_LDFLAGS等,e.g s.xcconfig = { “OTHER_LDFLAGS” => “-ObjC” }
  • s.resource_bundles 指定包含的資源檔案。
  • s.dependency 指定依賴,如s.dependency = ‘AFNetworking’

    更多資訊可查閱官方文檔:http://guides.cocoapods.org/syntax/podspec.html

驗證 .podspec 檔案的格式是否正确:

pod lib lint ADTextFieldLimit.podspec --verbose
           
  • –verbose 會給出詳細的資訊。
  • –allow-warnings 允許警告,預設有警告的podspec會驗證失敗。

    –fail-fast 遇到錯誤馬上停止,預設會完成全過程再停止。

  • –use-libraries 如果項目中引用了.a、.framework,在驗證和送出時需要加。
  • –sources 如果此podspec 依賴了其他不包含在官方specs裡的pod,則用它來指明源,比如依賴了某個私有庫。多個值以逗号分隔。

驗證成功出現:

-> ADTextFieldLimit (0.0.1)
 
ADTextFieldLimit passed validation.
           

驗證成功後,推到遠端:

git add .
git commit -m '添加關鍵檔案'
git push origin master     #送出到遠端倉庫
           

打标簽:

git tag 0.0.1
git push --tags
           

釋出 .podspec:

pod trunk push ADTextFieldLimit.podspec
           

釋出成功,出現下面提示:

使用CocoaPods建立開源庫和私有庫詳解

釋出成功後,會把podspec更新到官方的repo中,可以通路:https://cocoapods.org/pods/ADTextFieldLimit 在CocoaPods官網搜尋到自己的pod,也可以執行下面的指令來搜尋:

pod search 'ADTextFieldLimit'
           

但是有時候你在官網搜到了,而你在終端執行pod search 時卻報錯:

[!] Unable to find a pod with name, author, summary, or description matching `ADTextFieldLimit`
           

這是因為有可能你本地的repo不是最新的,執行更新,然後重新搜尋:

pod repo update
           

如果還是搜不到,可能是因為搜尋的緩存導緻,删除緩存重新搜尋:

rm ~/Library/Caches/CocoaPods/search_index.json
pod search 'ADTextFieldLimit'
           

搜所結果如下:

使用CocoaPods建立開源庫和私有庫詳解

然後别人就可以在項目中導入你的開源倉庫了。

建立私有庫

建立私有庫和公有庫步驟基本類似,差別是:

需要先在Git上建立遠端私有倉庫,然後在本地目錄下執行:

pod repo add 'repoName' 'repo URL'
           

編輯 .podspec,同上

驗證 .podspec,如果依賴了其他私有庫,需要使用–sources指定source。

pod lib lint BaseFundation.podspec --sources=https://github.com/liushuorepo/XMTextFieldLimit.git
           

釋出 .podspec

pod repo push 'BaseFundation' BaseFundation.podspec
           

使用私有庫

platform :ios, '9.0'
use_frameworks!
# 共用的pod第三方
pod 'BaseFundation', :git => 'https://github.com/liushuorepo/BaseFundation.git'
# 項目中的target各自的設定
target "xuanmeng" do
    #xuanmeng獨自引用
end
           

很多時候,在開發過程中,我們希望在開發私有庫的過程中,修改代碼後不用一直打tag并執行pod update,我們可以這樣寫Podfile:

pod 'BaseFundation', :path => '~/Desktop/BaseFundation'
           

這樣在普通的修改代碼時,不需要重新打tag并pod update,但是當工程結構有變化(檔案移動,增删等)、podspec修改,最好執行一次pod update。

參考文章:

  1. CocoaPods公有倉庫的建立:https://www.tuicool.com/articles/uq6NJnJ
  2. 使用Cocoapods建立私有podspec:http://www.cocoachina.com/ios/20150228/11206.html

繼續閱讀