前言
最近由於要做組件化,所以就順便看了看私有庫的制作,整體上制作的過程是比較簡單的,但有一些點你注意到的話會在制作過程會少去很多的麻煩,在網上搜的制作過程的文章是一大把,但當你真的遇到一些問題的時候在去找答案有些就會比較困難,所以出於這樣的一個初衷我在這里就把自己整個制作過程記錄下來,以及這這些過程中你需要注意的點全都一點點的寫出來,保證這篇文章能完全把整個過程說清楚,讓你看着這篇文章能夠完全理解過程和每一步我們到底是在做什么,而不是粘貼復制命令行,完了啥都不知道。
一:先說說關於CocoaPods
不知道關於CocoaPods你到底掌握到什么程度,下面就說說最簡單的關於幾個制作過程中需要注意的點:
先進入下面路勁打開看看:command + shift + g 輸入 ~/.cocoapods/repos 在1.8.0以后的版本中會有 trunk repo ,這是因為這個版本之后的Cocopods官方開始使用 CDN 不在使用以前的 master repo ,至於好處什么的我這里就不在說了,下面兩篇文章能說清楚。
master的source是
'https://github.com/CocoaPods/Specs.git'
而trunk
的source是
'https://cdn.cocoapods.org/'
可能有小伙伴會問這和我們制作私有庫有啥關系,這個我們后面肯定會說,你首先得區分好這點,可能有人在使用 CocoaPods 的時候有遇到下面這個問題:
[!] CDN: trunk URL couldn't be downloaded:
然后按照網上搜索出來的解決方法直接把trunk源給刪除了,因為網上90%的解決方案都是這個樣子的,我自己是不建議這樣,畢竟我們已經在使用新版本的Cocoapods,我們這樣做不就回到就版本了嗎?我自己還是喜歡嘗試新鮮的東西,雖然可能新的東西遇到的問題會比較多。至於新版怎樣利用CDN的方式都在下面文章中。
下面我制作的過程中CocoaPods的版本是 1.9.1
二:首先得有兩個遠程庫
這里先解釋一下為什么我們需要兩個遠程庫,假設這兩個庫分別為 A 和 B , A 我們用來存放我們制作私有庫項目的代碼, B 我們用來存放我們的私有庫。我想這句話應該是解釋清楚了為什么我么需要兩個遠程庫了,當然你要說你不需要把你制作私有庫的代碼上傳到遠程庫那也就意味這你不需要遠程庫A了,但這樣的確是不行的,這個我們后面再說。
我們用碼雲為例子,創建兩個遠程私有庫,填寫名稱什么的我就不說了,需要留意的也就下面兩個地方:
建議還是使用 Readme 文件初始哈倉庫吧,這樣我們后面使用 MarkDown 語言來寫使用說明會比較好,這也是現在很多三方在使用的方式。
三:制作私有庫
這個制作過程我們按照步驟的形式往下說:
1、承接上面 A B 遠程庫的邏輯,比如說你是用遠程私有庫 B 來存放私有庫,那你就先需要把 B 添加到你 CocoaPods 的本地 repo 中,終端打開准備干活了,命令如下:
完成上面的步驟之后還是按前面我們說的你進入到 CocoaPods 的 repo 中去看看就應該有了 B私有庫
2、在你本地創建一個文件夾用於存放項目 省略......
3、cd 到你上面創建的文件路徑下面,創建你需要制作私有庫的項目,執行下面命令:pod lib create 私有庫項目名稱 (建議這個名稱最好不要和你私有庫名稱重復,便於區分)
4、如上圖所示,我創建了三個私有庫項目用來制作私有庫,接下來要做的就是在替換文件或者是自己創建文件來寫你的私有庫項目代碼了,要是你已經寫好了你私有庫的代碼,那你就直接進入 ZXTestOCUIKit 路徑下面的 Class文件進行一個替換,這里我們補充一點就是關於文件分層的問題,假如你在 Class下面要把你的文件分別放到兩個文件下面,不是說我們直接放進去就可以了,這里涉及到 podspec 文件的設置問題,這里你先有個印象,具體的怎么處理我們在說 podspec 文件修改的時候集中說。
5、進入到 Example 路徑下面直接打開項目, 這里就一點,不管前面Class你是替換的文件還是你打開項目之后創建文件修改,改動完了之后都記得 pod install 一下!不然你在 Example 可能找不大你需要的文件。其實這里也有一個問題的,就是你把文件拉進來之后 不修改好 podspec 文件,執行 install 之后發現添加到項目中的文件引用不見了,我在嘗試的時候就有這個問題,在添加 Assest 資源的時候也有這個問題,你要是遇到這個問題就找下面修改 podspec 文件的內容設置要分層路徑再執行 install。
6、修改你的 podspec 打開項目找到最上面的 .podspec 文件,文件里面修改注意的點我都寫在注釋里面了。
Pod::Spec.new do |s| s.name = 'ZXTestOCUIKit' #版本號 s.version = '0.0.5' #摘要 s.summary = 'A Test Privity Kit About ZXTestOCUIKit.' # This description is used to generate tags and improve search results. # * Think: What does it do? Why did you write it? What is the focus? # * Try to keep it short, snappy and to the point. # * Write the description between the DESC delimiters below. # * Finally, don't worry about the indent, CocoaPods strips it! s.description = <<-DESC TODO: ZhangXu A Test Privity Kit About ZXTestOCUIKit. DESC # 你的主頁地址 填個能訪問的 不然可能檢驗的時候報錯 s.homepage = 'https://gitee.com/MrRisingSun' # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' s.license = { :type => 'MIT', :file => 'LICENSE' } # 作者 s.author = { 'Zhangxu' => 'zhangxu@pipipifa.com' } # 你制作私有庫項目的遠程地址 A s.source = { :git => 'https://gitee.com/MrRisingSun/ZXTsetOCUIKit.git', :tag => s.version.to_s } # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' # 最低版本 s.ios.deployment_target = '9.0' # 文件層級分類 #s.source_files = 'ZXTestOCUIKit/Classes/**/*' # 要是文件有分層 就這樣寫 s.subspec 'ZXLoadingView' do |ss| ss.source_files = 'ZXTestOCUIKit/Classes/ZXLoadingView/*.{h,m}' end s.subspec 'ZXUIView' do |ss| ss.source_files = 'ZXTestOCUIKit/Classes/ZXUIView/*.{h,m}' end # 資源 s.resource_bundles = { 'ZXTestOCUIKit' => ['ZXTestOCUIKit/Assets/*.{png,json,xcassets}'] } # s.public_header_files = 'Pod/Classes/**/*.h' # s.frameworks = 'UIKit', 'MapKit' # 依賴庫 s.dependency 'AFNetworking' s.dependency 'JSONModel' s.dependency 'lottie-ios','2.5.3' # 指定版本 s.dependency 'ZXTest2OCUIKit'
注意:里面涉及到資源引用路徑的時候稍微留意下,我在我的項目中引用了一個JSON格式文件的動畫資源,你要有別的格式的資源引用方式是一樣的。
還是那句,記得你要是修改了Class的文件,在寫Example 的時候記得 pod install 一下使用
7、上面這些就基本上該修改的也都修改好了,在進行后面的操作的時候,我們先本地校驗一下,按照我上面的創建 你應該在 ZXTestOCUIKit 文件下執行本地校驗,也就是在 Example 的這一層路徑下,別在 Example下校驗 ,執行 pod lib lint 就OK。本地檢驗這一步也是錯誤比較多的一步,這里會檢驗出創建的各種各樣的問題,你要有問題在后面錯誤的集中處理中看看有沒有可以幫助到你的,還有問題可以在我主頁QQ找我。
8、后面的操作就是一些關於git的操作, 我們先關聯git: git remote add origin 遠程倉庫地址 A
9、然后拉去一下代碼,正常的git流程:git pull 然后就報錯了,哈哈哈.... 使用 git pull origin master --allow-unrelated-histories (允許合並不相關的歷史內容) 正常這里是要沖突的,那就先解決一下沖突,你看那個文件沖突了,直接 vim 沖突文件 ,進去之后把沖突的地方刪除掉就OK了,(按 i 進入編輯狀態)。
10、上傳制作私有庫的項目代碼到遠程倉庫:
git add .
git commit -m'描述'
git pull origin master
git push origin master
11、打標簽,在最后制作私有庫之前我們需要給它打個標簽,在每一次我們修改文件更新私有庫上傳代碼的時候我們都要進行這一步的,並且保證你打的標簽和你本地 podspec文件的版本號是一致的。
git tag -a 0.0.1 (比如是這個版本) -m '0.0.1'(m 里面的內容都是描述內容)
git push --tags 標簽打完 你也可以通過 git tag 查看一下是不是你這個標簽
12、最后就是私有庫制作遠程檢驗的了,其實也是最后的制作,執行:
pod spec lint
這一步也是一個錯誤集中爆發地,后面我也在經理總結這里有的錯誤,其實整個過程不是很復雜,只要自己動手多走幾遍,慢慢的也就都理解不在覺得困難。
13、上傳私有庫到我們 cocoapods 的 repo
還記得最開始時候第一步我們添加的 repo B 嗎?我們現在把我們制作的私有庫提交到這個遠程倉庫中,執行下面命令:
pod repo push (cocoapods的repo) 你私有庫的.podspec 文件
走到這一步就算是我們的私有庫主要的我們制作完了,下面我們要說的這就是整個過程中你可能也會遇到的問題,其實真正讓我們糾結的夜從來都不是過程,而是這過程中遇到的個猴子那個各樣的問題,我甚至舔我 cocoapods 都重裝過,所以說有啥問題慢慢解決就可以了,終究你還是會成功的。
四:遇到的問題
1、使用問題:
具體的使用辦法是比較簡單的,你在你項目的 podfile 文件中加入你私有庫的源地址(B私有庫地址),然后正常的 pod '你的庫' ,最后先 pod update , pod install 就OK了,當然這是正常的情況,我們總結問題肯定不能總結正常的,我們說說不正常的。
<1>: 在你執行完上面13步之后可以 pod secrch '私有庫' ,這地方在 1.9.1 這個版本失敗的概率還是有的,我就經常失敗,要是你確保你的步驟沒問題,你再cocoapods 的 repo 當中也確實能看你的私有庫,那就跳過這邊一步,不要去網上找 pod search 失敗,你會發現答案很多可就是不是和現在這個流程,我在最前面說過 不要去采用刪除 master 源這個方式!
<2>: 為什么我的swift私有庫找不到方法、文件等等呀,我制作過程沒問題呀,當然這一步可能你在開始寫 Example 的時候也會有這個問題,它的答案就是 權限問題!swift 版本你要暴露的方法或者類什么的要使用open權限,我以為 public 默認的是沒問題的,結果是有問題!你可以找那些swift版本的三方庫就能發現是這個問題!
2、本地檢驗額問題:
<1>: 有警告檢驗不通過,就像下面這個一樣。
解決辦法:
其實最直接的辦法就是你直接執行 pod lib lint --allow-warnings 允許警告 ,但要是細節處理這幾個警告提挺有意思的,下面我們分析一下上面的三條警告:
1、摘要寫的太差了,就是連敷衍了事那種都沒做的地步,哈哈哈哈。。。當然要是你的摘要寫的比描述都多,你試試 😼
2、檢查一下寫的主頁地址還是項目地址有地方是有問題的,也就是連接不可用。所以我們前面雨說過主頁地址寫一個可以用的地址,百度都行,保證能正常訪問,項目地址就寫你遠程項目倉庫的地址,被填錯了。
3、第三個你上網去搜還能找出很多答案,有制作文件的等等,其實簡單點你指定一下swift的版本就可以了: s.swift_version = '4.0'
<2>: 我找不到答案的問題 私有庫相互依賴本地檢驗不過的問題 Returuned an unsuccessful exit code
這個問題我還真的是糾結了很久了,比如說你現在有叫做 Zhangxu1 和 Zhangxu2 的兩個私有庫,然后你在 Zhangxu2中要使用一些Zhangxu1的東西,你把他們都放在一個叫zhangxu的 cocoapods repo 下面,這時候你2依賴1,然后本地檢驗是捕獲通過的,錯誤如下:
說實話,按照上面的邏輯我暫時真的沒找到怎么解決,當然你可以說不要有依賴關系就可以了,這樣肯定是沒問題的,我糾結的點可能變成是不是不能這樣依賴,就兩個私有庫之間!如果有知道答案的小伙伴也請指教我一下,我也很想知道答案、原因!!
補充:
后面使用中發現兩個私有庫在相互依賴的情況下要進行校驗(包括本地和遠程)你是需要帶上 source 源的,具體的Demo如下:
pod lib lint --sources=http://192.168.1.92/ice/PPSpecs.git,https://cdn.cocoapods.org/
前面的源是你CocoaPods中的repo地址,我這個后面是還依賴了逼得三方,需要指定 CocoaPods的trunk源地址。
3、遠程校驗問題:
你有依賴別的第三方庫, 直接使用 pod spec lint 檢驗不行,那就試着加上源地址試試吧:
4、還有許多會是一些關於 CocoaPods 的問題
我在前面有說過我利用一個json格式的文件,其實是用來做動畫的,然后我嘗試導入 lottie-ios 結果.....一直報下面這個錯,然后上網找呀找,找呀找答案找的我睡着了還沒解決,結果回到公司再次嘗試。得到的結論就是應該是我網絡差!┭┮﹏┭┮
當然還有許許多多的問題,只不過我寫這篇文章的時候是我忙完這些后面一個星期了,有些我記得也是模棱兩可了!記性差.......
總結就暫時這么多吧, 在整個私有庫的使用過程中我相信關於它的問題我還是會遇到很多的,我再回來補充!