基于SVN的組件化私有庫的創(chuàng)建指北

前期準備

1 安裝 cocoapods

先安裝好 cocoapods 團隊可統(tǒng)一使用1.5.3版本。
如果下載 master 索引庫 速度很慢,可以直接從同事那里復制過來(我們已經(jīng)做了第三方庫私有庫化,master 的索引庫也可以不下載)

2 安裝 cocoapods - svn 插件

cocoapods 默認的 spec repo,是基于 git 的,可創(chuàng)建基于 git 管理的私有庫 spec repo。而我們使用的是 svn,所以還需要安裝 cocoapods - svn 插件

終端輸入 sudo gem install cocoapods-repo-svn

3 添加私有庫索引

在終端里輸入(在任意文件下目錄下)pod repo-svn add my-svn-repo [http://svn-repo-url](http://svn-repo-url/)

比如添加我們的XX索引庫就是 pod repo-svn add XXSpecs xxx

如果提示沒有權限就看下,在 svn 能不能看到這個路徑。如果沒有就申請下。

如果遇到有權限但是私有庫索引還是無法下載,可能是終端中還未輸入賬號密碼,svo co xxx 會提示你輸入密碼的

輸入defaults write com.apple.finder AppleShowAllFiles YES 打開隱藏文件

重啟 finder 后可以看到效果

這個時候你會發(fā)現(xiàn)文件夾路徑 你的用戶名/cocoapods/repos 下多了一個 XXSpecs 。

這個就是我們私有庫的索引,我們之所以能在podfile寫上版本號就能找到對應的代碼地址和文件組織結構方式,就是因為索引庫里存放了版本號對應的 podspecpodspec 待會具體分析,我們自己要寫)

接下來就可以創(chuàng)建自己的私有庫了

1 私有庫標準模板還是裸奔?

開始具體操作流程前先理解一下庫是如何被 cocoapods 找到的。其實必要的只有一個文件那就是 podspec,他包含了所有必要和不必要的信息。

而像 cocoapods master 索引庫里數(shù)以萬計的索引查找,作者自己寫了 Molinillo 算法,提高效率。

在做一些私有庫的時候,如果不需要單獨跑起來的,比如基礎庫等,就沒必要選擇創(chuàng)建一個 私有庫標準模板。

一個 classes 文件夾存放 類文件,一個 assets 文件夾存放 資源即可 再加一個 podsepc 即可。

業(yè)務組件必須創(chuàng)建標準模板?。ǚ奖泸炞C和單獨Debug,后期殼工程拆的好的話,似乎也沒必要)

2創(chuàng)建標準模板步驟

1 cd到想要存放的目錄下 執(zhí)行 pod lib create XXEGOImageLoading(庫的名字) 這一步會下載標準模板(如果遇到網(wǎng)絡卡主,就復制一個吧,正常情況應該是分分鐘)

顯示6個問題:

1. 在哪個平臺上使用(iOS)

2. 你想使用哪種語言(ObjC)

3. 是否需要一個Demo應用(Yes)

4. 選擇一個測試框架(None)

5. 是否基于View測試(No)

6. 類的前綴(XX)

回答完6個問題他會自動執(zhí)行pod install命令創(chuàng)建項目并生成依賴,項目結構如下:

XXEGOImageLoading
├── Example #demo APP
│ ├── XXEGOImageLoading
│ ├── XXEGOImageLoading.xcodeproj
│ ├── XXEGOImageLoading.xcworkspace
│ ├── Podfile #demo APP 的依賴描述文件
│ ├── Podfile.lock
│ ├── Pods #demo APP 的依賴文件
│ └── Tests
├── LICENSE #開源協(xié)議 默認MIT
├── XXEGOImageLoading #組件的目錄
│ ├── Assets #資源文件
│ └── Classes #類文件
├── XXEGOImageLoading.podspec #第三步要創(chuàng)建的podspec文件

2 編輯 podspec

編輯 podspec 前先說明一下各個參數(shù)的意義

Pod::Spec.new do |s|

#名稱

s.name = "XXXXX"

#版本號

s.version = "0.1.0"

#簡短介紹

s.summary = "Just Testing."

#詳細介紹

s.description = <<-DESC

XXXXX description

DESC

#主頁,這里要填寫可以訪問到的地址,不然驗證不通過

s.homepage = "http://www.baidu.com"

#截圖

# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2"

#開源協(xié)議

s.license = 'MIT'

#作者信息

s.author = { 'feiyuchao' => 'xxx' }

s.source = { :svn => 'XXX)', :tag => s.version.to_s }

#多媒體介紹地址

# s.social_media_url = 'https://twitter.com/<twitter_username>'

#支持的平臺及版本

s.platform = :ios, '8.0'

#是否使用ARC,如果指定具體文件,則具體的問題使用ARC

s.requires_arc = true

#代碼源文件地址,**/*表示Classes目錄及其子目錄下所有文件,如果有多個目錄下則用逗號分開,如果需要在項目中分組顯示,這里也要做相應的設置

s.source_files = 'XXEGOImageLoading/Classes/**/*'

#資源文件地址

s.resource_bundles = {

'XXEGOImageLoading' => ['XXEGOImageLoading/Assets/*.{storyboard,xib,xcassets,json,imageset,png}']  這里不加 png 加**等的話就是尋找所有文件

}

#公開頭文件地址

s.public_header_files = 'XXEGOImageLoading/Classes/**/*.h'

#該pod依賴的系統(tǒng)framework,多個用逗號隔開

s.frameworks = 'UIKit','CoreGraphics'

#該pod依賴的系統(tǒng)library,多個用逗號隔開

s.libraries = 'iconv','sqlite3','stdc++','z'

#第三方.a文件

s.vendored_libraries = 'XXEGOImageLoading/Classes/ThirdParty/*.{a}'

#第三方frameworks文件

s.vendored_frameworks = ['XXEGOImageLoading/Classes/xx.framework',

'XXEGOImageLoading/Classes/xxx.framework']

#依賴關系,該項目所依賴的其他庫,如果有多個需要填寫多個s.dependency

s.dependency 'AFNetworking', '~> 2.3'

end

3 推送索引

1 關聯(lián)到具體的svn 地址。在 git 里 是git remote add origin xxx svn我一般是先建倉庫,再下載下來。svn 倉庫創(chuàng)建的時候需要分文件夾branch tags trunk

2 推送成功之后打好 tag ,tag 要保證和podfile 里的 tag 一致

3 再回到本地,cd到 文件夾 包含 podsepc的目錄下,執(zhí)行以下命令:$ pod repo-svn push XXSpecs xxx.podspec --allow-warnings --sources=xxx--use-libraries --verbose

sources 是表示需要尋找的依賴從哪里尋找,如果沒有依賴,pod repo-svn push XXSpecs xxx.podspec 即可

這一步如果執(zhí)行完畢沒有 Error,那么可以進入~/.cocoapods/repos/XXSpecs中,可以看到xxx 組件了,并且內部有一個 0.1.0 文件夾,內部有一個xxx.podspec文件。

有問題的話,請確認本地是否已添加 XXSpecs 私有庫,并且你在該私有庫下?lián)碛凶銐虻臋嘞?/p>

如果私有庫里面引用靜態(tài)庫會導致驗證是無法通過的,報錯 include of non-modular header inside framework module ··· [-Werror,-Wnon-modular-include-in-framework-module] ,加上--use-libraries。

如果驗證失敗,請查找 - error 或者 - note 查看失敗信息,進行相應更改。

如果你是第一次初始化項目,應該是沒有 Error 的,畢竟你的組件中啥都沒有。

空的私有庫創(chuàng)建結束之后如何組織文件

標準的私有庫如下

所需要做的工作就是在相應的Pods/Developemnt Pods/組件 /Classes 下編碼,

就是向Development Pods文件夾中添加庫文件和資源,

將編寫的組件相關的class放入xxx/Classes中、資源圖片文件放入xxx/Assets中,

并配置podspec文件,然后進入Example文件夾執(zhí)行pod install命令,

再打開項目工程可以看到,剛剛添加的組件已經(jīng)在Pods子工程下Development Pods/xxx中了。

如果遇到.a mrc 或者framework的可以參考對 podspec 的解析

其他的問題會有2個

1 資源文件如何被添加,如何被獲取。

1 spec.resources = ["Images/*.png", "Sounds/*"] 可以看到很多第三方庫都是這么寫,我做私有庫本地化的時候也是這么寫的。但是不建議。 這些資源文件在 build 時會被直接拷貝到 client targetmainBundle 里。帶來了一個問題,
那就是 client target的資源和各種pod 所帶來的資源都在同一bundle 的同一層目錄下,很容易產(chǎn)生命名沖突。

例如,我的 app 里有張按鈕圖片叫 “button.png",而你的 pod 里也有張圖片叫 "button.png",拷貝資源時,我很擔心 pod 里的文件會不會把我 app 里的同名文件給覆蓋掉?即使沒覆蓋掉,程序運行時到底用哪張?很顯然,我們不希望上述事情發(fā)生。

2 s.resource_bundles = { 'xxx' => ['xxx/Assets/**/*'] }
最好是這么寫
這種方法利用 framework 的命名空間,有效防止了資源沖突。pod會把添加的資源文件編譯成 bundle,使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 對象,再搜索具體資源,其中需要注意的方法[NSBundle bundleForClass:<#ClassFromPodspec#>] 返回某個 class 對應的 bundle 對象。具體的:

具體可以參考這篇文章 鏈接

2 拆庫的發(fā)現(xiàn)有的文件不在自己的模塊里,在其他模塊里。這個時候嚴格來講應該是找人一起評估下,這個共有的文件是否需要下沉到下一層,依賴他。

或者直接復制一個文件,改一下前綴名??梢宰约喊盐铡R话憬ㄗh商量一下,由負責基礎組件的同事去下沉。

實際開發(fā)中可能會出現(xiàn)負責基礎組件的同事在忙其他業(yè)務開發(fā),不能及時幫忙拆庫。

pods一般業(yè)務組件用不到。暫時不寫了。

私有庫開發(fā)流程如何開發(fā)才能高效

私有庫的版本控制肯定是用 tag來做的。和 master的做法一樣,版本號和實際代碼分開,版本號有專門的一個庫,就是我們的索引庫 XXSpecs。

但是實際開發(fā)中,測試提一個bug,我們就要去更新一個tag嗎,工作量很大(推代碼 - 打tag - 推索引)。

cocoapods 肯定早就想到了,解決了我們的困境。

pods 有 三種寫法,第一種和第二種一樣,我們可以直接在developpods 修改代碼。

第三種寫定具體的版本號,一般上線前 才去打死 tag 號。最后一定要用 版本號代替第一種和第二種,不然私有庫就沒有意義,也無法做好版本控制。

其他開發(fā)流程和 之前git flow流一樣操作。

 pod 'XXErrorLayer', :path => '/Users/feiyuchao/Desktop/XXErrorLayer/trunk'     指向本地,只要文件里有 podspec 即可,出現(xiàn)在 developpods 里。

 pod 'XXErrorLayer', :svn => xxx') 指向遠程,其他和第一種一樣

 pod 'XXErrorLayer', "1.0.0" 出現(xiàn)在鎖住的 pods 里。

添加第三方庫的策略

原則上不要隨意添加私有庫,尤其一個功能不要添加多個庫。

如果我們用的是git 直接fork 一下,修改一下podspec即可。 我們現(xiàn)在可能需要自己編寫spec,和組織文件,再推到我們的 svn 地址上。

不知道有沒有更好的方案,重復操作的事情腳本化(不會寫)

有些踩過的坑

1 如果在更新工程pod后,發(fā)現(xiàn) 組件版本 和 最新發(fā)布 的組件版本 一致,但是代碼貌似不是最新的代碼,那么可能是由于 cocoaPods 的本地緩存導致的問題,可以執(zhí)行如下代碼清除緩存:

pod cache clean --all

2 頭文件<xxx/xxx>無法找到。但是“” 能找到,那是因為沒有分子pods

3 驗證無法通過怎么辦? 如果明明是沒有問題的,但是各種客觀原因無法推上去,可以采取野路子,索引庫也是一個庫,直接手動推送你的podsepc上去即可

4 .a文件找不到。由于我們的svn自動忽略了.a 文件,改一下忽略文件即可

5 如果 run 主工程的時候提示鏈接錯誤, 有可能是主工程存在著你私有庫的文件,還沒有刪除

6 如果 pod install 提示索引找不到該私有庫,可能是別的同事推了索引庫新的版本,但是你還沒更新,執(zhí)行 pod repo-svn update 如果不行,你也可以自己手動加的

7 如果推的時候提示- ERROR | [iOS] unknown: Encountered an unknown error (/usr/bin/xcrun simctl list -j devices,可能是 xcode 路徑不正確

sudo xcode-select -s /Applications/xcode.app 搞定 后面是你的xcode 路徑 有可能 xcode 不在程序里,我的就是在桌面

還能做些什么

1 不知道 svn 能不能分讀寫權限, 原則上 每個庫的實際負責人員也有寫的權利。 比如我想修改一下別人負責的庫,應該提PR,而不是直接papapa改了

2 Pods 文件 加入忽略文件,因為clone 下來之后 會有一些問題。 需要刪除 pods 重新pod install

3 理想的平滑二進制化

4 更好結合CI

5 更好的路由方案

6 資源命名規(guī)范化 看到有的圖片就叫show@2x..容易覆蓋

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 項目組件化、平臺化是技術公司的共同目標,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 22,051評論 0 39
  • Cocoapods是非常好用的一個iOS依賴管理工具,使用它可以方便的管理和更新項目中所使用到的第三方庫,以及將自...
    Nash33閱讀 2,098評論 0 50
  • 最近想為公司搭建cocoapods私有庫框架,老早之前做過,踩過不少坑,想不到又一次掉坑里。果真是好記性不如爛筆頭...
    生光閱讀 1,563評論 0 4
  • 前言 CocoaPods是一個程序依賴管理工具,使用CocoaPods可以節(jié)省設置和更新第三方開源庫的時間,同樣的...
    Dennis_me閱讀 2,044評論 0 4
  • 最近在學習vue.js的時候發(fā)現(xiàn),vue的組件化的思想對于編寫代碼是一個非常有用的事情。 首先為什么需要組件化? ...
    拂曉的云閱讀 7,204評論 6 23