基于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

如果提示沒有權(quán)限就看下,在 svn 能不能看到這個路徑只厘。如果沒有就申請下烙丛。

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

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

重啟 finder 后可以看到效果

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

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

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

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

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

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

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

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

業(yè)務組件必須創(chuàng)建標準模板!(方便驗證和單獨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)建項目并生成依賴,項目結(jié)構(gòu)如下:

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 推送成功之后打好 tagtag 要保證和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 組件了,并且內(nèi)部有一個 0.1.0 文件夾尖殃,內(nèi)部有一個xxx.podspec文件丈莺。

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

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

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

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

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

標準的私有庫如下

所需要做的工作就是在相應的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)有的文件不在自己的模塊里榕莺,在其他模塊里俐芯。這個時候嚴格來講應該是找人一起評估下,這個共有的文件是否需要下沉到下一層钉鸯,依賴他吧史。

或者直接復制一個文件,改一下前綴名唠雕∶秤可以自己把握。一般建議商量一下岩睁,由負責基礎組件的同事去下沉莽使。

實際開發(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 能不能分讀寫權(quán)限是复, 原則上 每個庫的實際負責人員也有寫的權(quán)利删顶。 比如我想修改一下別人負責的庫,應該提PR淑廊,而不是直接papapa改了

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

3 理想的平滑二進制化

4 更好結(jié)合CI

5 更好的路由方案

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末季惩,一起剝皮案震驚了整個濱河市录粱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌画拾,老刑警劉巖啥繁,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異青抛,居然都是意外死亡旗闽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門蜜另,熙熙樓的掌柜王于貴愁眉苦臉地迎上來适室,“玉大人,你說我怎么就攤上這事举瑰〉妨荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵此迅,是天一觀的道長汽畴。 經(jīng)常有香客問我,道長耸序,這世上最難降的妖魔是什么整袁? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮佑吝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绳匀。我一直安慰自己芋忿,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布疾棵。 她就那樣靜靜地躺著戈钢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪是尔。 梳的紋絲不亂的頭發(fā)上殉了,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音拟枚,去河邊找鬼薪铜。 笑死众弓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的隔箍。 我是一名探鬼主播谓娃,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜒滩!你這毒婦竟也來了滨达?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤俯艰,失蹤者是張志新(化名)和其女友劉穎捡遍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹握,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡画株,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涩搓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片污秆。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖昧甘,靈堂內(nèi)的尸體忽然破棺而出良拼,到底是詐尸還是另有隱情,我是刑警寧澤充边,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布庸推,位于F島的核電站,受9級特大地震影響浇冰,放射性物質(zhì)發(fā)生泄漏贬媒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一肘习、第九天 我趴在偏房一處隱蔽的房頂上張望际乘。 院中可真熱鬧,春花似錦漂佩、人聲如沸脖含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽养葵。三九已至,卻和暖如春瘩缆,著一層夾襖步出監(jiān)牢的瞬間关拒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留着绊,地道東北人谐算。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像畔柔,于是被迫代替她去往敵國和親氯夷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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

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