前言
項目私有化目的
項目書寫的時候肯定是剛開始比較簡單贩虾,功能也比較少,模塊比較少肯定能滿足項目的需求仰泻,隨著項目模塊的增多,項目的代碼量也逐漸增加背亥,很有可能會有多人進行開發(fā),提交合并代碼會很頭痛悬赏,模塊化給我們一個很好的解決方式,讓我們開始吧娄徊。
創(chuàng)建私有庫 spec repo
spec repo 是所有的Pods的一個索引闽颇,就是一個容器,所有公開的Pods都在這個里面寄锐,他實際是一個Git倉庫remote端 在GitHub上兵多,但是當你使用了Cocoapods后他會被clone到本地的~/.cocoapods/repos目錄下,可以進入到這個目錄看到master文件夾就是這個官方的Spec Repo了橄仆。這個master目錄的結構是這個樣子的
#~/.cocoapods/repos 大致目錄是這樣的
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
所以我們需要創(chuàng)建一個類似master結構的spec repo github 私有倉庫是收費的剩膘, 我選擇了Coding 還有其他的服務 像 gitLab、開源中國盆顾、Bitbucket怠褐、CSDN。
在terminal創(chuàng)建 repos
# pod repo add [Private Repo Name] [HTTPS clone URL]
$ pod repo add WMCommon https://git.coding.net/fufu62/WSPCommon.git
此時如果成功的話進入到~/.cocoapods/repos目錄下就可以看到WMCommon這個目錄了您宪。至此第一步創(chuàng)建私有Spec Repo完成奈懒。
創(chuàng)建 podspec 文件
已經(jīng)有了現(xiàn)成的項目,需要給這個項目創(chuàng)建一個podspec文件宪巨,創(chuàng)建它需要執(zhí)行Cocoapods的另外一個命令磷杏,官方文檔在這里
在本地項目目錄下創(chuàng)建
$ pod spec create WPCommon
執(zhí)行完之后,就創(chuàng)建了一個podspec文件捏卓,他其中會包含很多內容极祸,可以按照我之前介紹的進行編輯,沒用的刪掉。
Pod::Spec.new do |s|
s.name = "WPCommon"
s.version = "0.2"
s.summary = "the project for WPCommon"
s.homepage = "https://git.coding.net/fufu62/WSPCommon.git"
s.license = "MIT"
s.author = { "ISPWang" => "sanpeng123@126.com" }
s.platform = :ios, "7.1"
s.ios.deployment_target = "7.1"
s.source = { :git => "https://git.coding.net/fufu62/WSPCommon.git", :tag => "0.1" }
s.source_files = "CommonTest/CommonTest/Mine/Controller/**/*.{h,m}"
s.frameworks = "UIKit"
s.requires_arc = true
end
# 編輯完成之后使用驗證命令驗證一下
$ pod lib lint
WPCommon passed validation. #驗證無錯誤
# 可以進入下一步了遥金。沒有驗證過去 根據(jù)錯誤提示進行修改 podspec文件
本地測試pod spec文件
我們可以創(chuàng)建一個新的項目浴捆,在這個項目的Podfile文件中直接指定剛才創(chuàng)建編輯好的podspec文件,看是否可用汰规。 在Podfile中我們可以這樣編輯汤功,有兩種方式
platform :ios, '7.1'
pod ‘WPCommon', :path => ‘~/Code/WSPCommon/CommonTest' # 指定路徑
pod 'WPCommon ', :podspec => '~/Code/WSPCommon/CommonTest/WPCommon.podspec'
然后執(zhí)行pod install命令安裝依賴,打開項目工程溜哮,可以看到庫文件都被加載到Pods子項目中了滔金,不過它們并沒有在Pods目錄下,而是跟測試項目一樣存在于Development Pods/WPCommon中茂嗓,這是因為我們是在本地測試餐茵,而沒有把podspec文件添加到Spec Repo中的緣故。
在項目中編寫代碼述吸,測試庫文件無誤后就可以開始下一步了忿族,提交podspec到Spec Repo中。
提交步驟
# 提交代碼
git add -A && git commit -m "Release 0.1"
# 打tag
git tag -m “new version” ‘0.1'
# 把tag推到遠程倉庫
git push --tags
# 將本地的master分支推送到遠程倉庫
git push origin master
向Spec Repo提交pod spec
向Spec Repo提交podspec需要完成兩點一個是podspec必須通過驗證無誤蝌矛,在一個就是刪掉無用的注釋(這個不是必須的道批,為了規(guī)范還是刪掉吧)。 向我們的私有Spec Repo提交podspec只需要一個命令
$ pod repo push WMCommon WPCommon.podsepc #前面是本地Repo名字 后面是pod spec名字
完成之后這個組件庫就添加到我們的私有Spec Repo中了入撒,可以進入到~/.cocoapods/repos/WTSpecs目錄下查看
.
├── LICENSE
├── WPCommon
│ └── 0.1
│ └── WPCommon.podspec
└── 0.2
│ └── WPCommon.podspec
└── README.md
再去看我們的Spec Repo遠端倉庫隆豹,也有了一次提交,這個podspec也已經(jīng)被Push上去了茅逮。
pod search WPCommon
-> WPCommon (0.2)
A short test for of WPCommon.
pod 'WPCommon', '~> 0.2'
- Homepage: https://git.coding.net/fufu62/WSPCommon.git
- Source: https://git.coding.net/fufu62/WSPCommon.git
- Versions: 0.2, 0.1 [WMCommon repo]
使用制作好的Pod
在Pod file 文件里增加私有庫文件即可
source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.coding.net/fufu62/WSPCommon.git'
platform:ios,’8.0’
target "cocoapodsTest" do
pod 'MJRefresh'
pod 'SDWebImage', '~> 3.8.1'
pod 'WPCommon', '~> 0.2'
end
# 快速更新狀態(tài)
pod update --no-repo-update
中間會出現(xiàn)警告
—no-clean
或者error ?
Assuming you are using git for that repo, can you run git status? If the repo is clean it would say something like nothing to commit, working directory clean.
Sorry, can you run git status --porcelain, that’s the exact command it runs
pod repo push WMCommon WMCommon.podspec --allow-warnings --verbose
// --allow-warnings : 允許 警告璃赡,有一些警告是代碼自身帶的。
// --use-libraries : 私有庫献雅、靜態(tài)庫引用的時候加上
// —verbose : lint顯示詳情
框架中如果使用Xib加載crash的情況
出現(xiàn)通過mainBundle加載不了碉考,無法獲取Xib
[NSBundle bundleForClass:[self class] 獲取bundle
// 這樣之后,無論是通過copy文件夾方式還是CocoaPods下載安裝的方式挺身,都能正常使用xib進行初始化了
CocoaPods下載框架中圖片無法正常顯示通過ImageName
- 通過CocoaPods下載安裝侯谁,如果xib中直接填寫好的圖片,則圖片資源能直接顯示瞒渠,如果通過代碼"[UIImage imageNamed:@""]"去設置的話良蒸,則圖片資源根本顯示不了
//改變代碼圖片路徑
// 圖片路徑
#define WMCommonSrcName(file) [@"WMCommon.bundle" stringByAppendingPathComponent:file]
#define WMCommonFrameworkSrcName(file) [@"Frameworks/WMCommon.framework/WMCommon.bundle" stringByAppendingPathComponent:file]
WMCommonSrcName(file) 為通過copy文件夾方式獲取圖片路徑的宏
WMCommonFrameworkSrcName(file) 為通過cocoapods下載安裝獲取圖片路徑的宏
之后修改代碼中設置圖片的方式如下:
UIImage *img = [UIImage imageNamed:WMCommonSrcName(@"image.png")]?:[UIImage imageNamed:WMCommonFrameworkSrcName(@"image.png")];
參照
使用Cocoapods創(chuàng)建私有pod spec
iOS CocoaPods 私有庫 steps and tips
CocoaPods 詳解之——更新篇
iOS移動端架構的那些事