記錄一次上傳文件到 pod 的初級(jí)體驗(yàn)
iOS常用第三方管理工具cocoapods欠动,很多人都在用镐躲,也確實(shí)方便骆捧。那么如何將自己的代碼發(fā)布到cocoapods呢,作為萌新就baidu顿膨、google唄锅锨。
當(dāng)然,作為萌新恋沃,嘗試的時(shí)候肯定都是坑啊必搞,要不然咋是萌新呢。
ps :訣竅--嘗試的時(shí)候盡可能精簡(jiǎn)囊咏,這樣容易過(guò)恕洲,一次一次增加難度塔橡,這樣出現(xiàn)問(wèn)題的時(shí)候就不會(huì)太多,解決起來(lái)也不會(huì)有砸電腦的沖動(dòng)^_^
使用pod模板開(kāi)發(fā)項(xiàng)目 關(guān)于pod lib create
pod lib create projectName
手動(dòng)創(chuàng)建podspec
- 新建項(xiàng)目霜第,提交到GitHub或者其他代碼托管網(wǎng)站葛家,有下載鏈接就行(后邊需要用到托管平臺(tái)的代碼tag或者commit 作為需要發(fā)布的版本代碼)
- 我查看過(guò)一些其他人寫(xiě)的,會(huì)把要上傳的文件提到項(xiàng)目根目錄泌类,或者復(fù)制一份癞谒,但是我覺(jué)得比較麻煩,還是按照正常的項(xiàng)目處理的刃榨,也是可以的弹砚,木有問(wèn)題
- 準(zhǔn)備 podspec 文件
- 打開(kāi)終端,cd到項(xiàng)目當(dāng)前跟目錄枢希,執(zhí)行
pod spec create xxxname
(xxxname為項(xiàng)目名稱(chēng)) - 具體內(nèi)容
- 打開(kāi)終端,cd到項(xiàng)目當(dāng)前跟目錄枢希,執(zhí)行
Pod::Spec.new do |s|
s.name = "BSAFNetWorking"
s.version = "0.1.0"
s.summary = "AFNetWorking changed BSAFNetWorking"
s.description = <<-DESC
封裝AFNetWorking 提供提供body體請(qǐng)求(setHTTPBody方式)迅栅,提供表單格式方式請(qǐng)求(application/x-www-form-urlencoded)
提供上傳、下載晴玖、普通網(wǎng)絡(luò)請(qǐng)求
DESC
s.homepage = "https://github.com/BlackStarLang/BSAFNetWorking.git"
s.author = { "BlackStar" => "blackstar_lang@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/BlackStarLang/BSAFNetWorking.git", :tag => s.version }
s.source_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.public_header_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.framework = "UIKit"
s.dependency "AFNetworking", "~> 3.0"
s.license= { :type => "MIT", :file => "LICENSE" }
s.subspec 'BSApi' do |ss|
ss.source_files = "BSAFNetWorking/SQBaseApi/BSApi/*"
ss.framework = "UIKit"
end
通過(guò)命令行創(chuàng)建的文件是帶有很多注釋的,不過(guò)很多我都用不上为流,為了看的清楚呕屎,我把沒(méi)用的都刪了。如果想看所有的敬察,可以看看具體的項(xiàng)秀睛,以便于增加或修改spec項(xiàng)
spec文件中的每行代碼的意思差不多翻譯就可以了
-
劃重點(diǎn):
- 注意示例匯中 s.description 的格式,格式不對(duì)會(huì)報(bào)錯(cuò)(當(dāng)然莲祸, s.description 整行注釋掉也可以)
- s.license 必須要有蹂安,我是到MIT官網(wǎng)找的,也可以是 .md & .txt格式的锐帜,或者其他協(xié)議 田盈,協(xié)議內(nèi)容如下(只需要改變第一行版權(quán)所有人信息即可,其他不用動(dòng))缴阎,但是可能出現(xiàn)發(fā)布后出現(xiàn) warning的問(wèn)題允瞧,說(shuō)找不到LECENSE,解決辦法就是在GitHub或者gitlab上都可以直接在倉(cāng)庫(kù)中新建蛮拔,然后可以選擇很多種種類(lèi)的述暂,我都是選擇MIT,我將gitlab或github上創(chuàng)建的開(kāi)原協(xié)議引用到此處就沒(méi)有再報(bào)警告
- 協(xié)議如下
Copyright (c) 2018 BlackStar <blackstar_lang@163.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
- s.dependency 是你項(xiàng)目需要依賴(lài)的第三方建炫,比如說(shuō)我的這個(gè)是封裝的AFNetworking 畦韭,肯定需要依賴(lài)AFNetworking的,所以肛跌,依賴(lài)一個(gè)寫(xiě)一個(gè)艺配,依賴(lài)多個(gè)寫(xiě)多個(gè)察郁,寫(xiě)法基本和podfile里一樣,可以不加版本號(hào)妒挎,但是不能指定代碼源绳锅,代碼源都是在podfile里去聲明的 ,如下:
s.dependency "AFNetworking"
s.dependency 'SDWebImage','~> 4.1.0'
- s.framework 是依賴(lài)的系統(tǒng)框架,我這里只用了 UIKit酝掩。
如果依賴(lài)多個(gè)系統(tǒng)框架鳞芙,可以一行搞定,和dependency是不一樣的期虾,dependency是不支持多個(gè)依賴(lài)一行搞定的,注意 frameworks 是帶有s的哦原朝,這個(gè)和依賴(lài)單個(gè)框架是不一樣的。
s.frameworks = "UIKit","UIFoundation"
5.特別注意 s.source_files 坑很多镶苞,一定要搞準(zhǔn)你要上傳文件的目錄位置喳坠,要不然一遍一遍過(guò)不去
搞不準(zhǔn)目錄寫(xiě)的對(duì)不對(duì)點(diǎn)擊這里看demo
我們的pod文件可能是有多個(gè)文件夾的茂蚓,如果不特殊處理,上傳后的文件是沒(méi)有分目錄的聋涨,和我們工程內(nèi)分的目錄沒(méi)關(guān)系晾浴,都在一個(gè)文件夾里。想要帶有目錄結(jié)構(gòu)需要將每一個(gè)文件夾設(shè)置成子模塊脊凰,具體寫(xiě)法如下
Pod::Spec.new do |s|
s.name = "BSAFNetWorking"
s.version = "0.1.0"
s.summary = "AFNetWorking changed BSAFNetWorking"
s.description = <<-DESC
封裝AFNetWorking 提供提供body體請(qǐng)求(setHTTPBody方式),提供表單格式方式請(qǐng)求(application/x-www-form-urlencoded)
提供上傳茂腥、下載、普通網(wǎng)絡(luò)請(qǐng)求
DESC
s.homepage = "https://github.com/BlackStarLang/BSAFNetWorking.git"
s.author = { "BlackStar" => "blackstar_lang@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/BlackStarLang/BSAFNetWorking.git", :tag => s.version, :submodules => true}
s.source_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.public_header_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.framework = "UIKit"
s.dependency "AFNetworking", "~> 3.0"
s.license= { :type => "MIT", :file => "LICENSE" }
//子模塊
s.subspec 'BSApi' do |ss|
ss.source_files = "BSAFNetWorking/SQBaseApi/BSApi/*"
ss.framework = "UIKit"
end
//子模塊
s.subspec 'BSApi1' do |ss|
ss.source_files = "BSAFNetWorking/SQBaseApi/BSApi1/*"
ss.framework = "UIKit"
end
end
看好幾個(gè)end哦最岗。
注意 :每個(gè)subspec 對(duì)應(yīng)一個(gè)end帕胆,如果不想將組件發(fā)布出來(lái)供大家使用仑性,只是想公司內(nèi)部使用,可以將podspec放在 自己的項(xiàng)目網(wǎng)絡(luò)地址上诊杆,比如說(shuō)在公司的 gitlab 上歼捐,創(chuàng)建一個(gè)項(xiàng)目專(zhuān)門(mén)用來(lái)管理podspec
創(chuàng)建后復(fù)制倉(cāng)庫(kù)地址,終端執(zhí)行命令晨汹,對(duì)應(yīng)命令:pod repo push 你的倉(cāng)庫(kù)地址 xxx.podspec --allow-warnings
發(fā)布完成后,需要用的時(shí)候淘这,需要在podfile里聲明你的podspec倉(cāng)庫(kù)地址
source 'https://xxxxx.git'
然后你就可以下載使用了,如果你是用的非GitHub進(jìn)行托管的(如gitlab)剥扣,pod search 是搜不到的,因?yàn)樗撬接械模ㄈ绻腴_(kāi)源給大家钠怯,那就上github佳魔,然后發(fā)布到開(kāi)源庫(kù))
- podspec 文件準(zhǔn)備好后晦炊,檢查文件合法性
pod spec lint xxxx.podspec --allow-warnings
需要加 --allow-warnings鞠鲜,要不然基本過(guò)不去
可能報(bào)錯(cuò) 第三方引入有問(wèn)題,讓你用#import<>的方式引入断国,引入的時(shí)候主要要帶有 文件路徑引入贤姆,如引入AFNetworking需要這么寫(xiě)#import <AFNetworking/AFNetworking.h>
不能寫(xiě)#import <AFNetworking.h>
或者#import "AFNetworking.h"
如果改完代碼 還是報(bào)這個(gè)錯(cuò)誤,需要清理緩存 :
pod cache clean --all
//然后在
pod spec lint xxx.podspec
如果對(duì)自己有信心也可以不走lint的步驟稳衬,直接發(fā)布
- 這一步過(guò)了就說(shuō)明代碼已經(jīng)木有問(wèn)題了霞捡,那么如何提交到網(wǎng)絡(luò)供人下載使用呢?
//終端執(zhí)行
pod trunk me //檢查是否有賬戶(hù)
//沒(méi)有則注冊(cè)薄疚,郵箱地址需要真實(shí)有效碧信,需要接收郵件驗(yàn)證,好像需要翻墻街夭,不大記得了
pod trunk register 郵箱地址 "昵稱(chēng)"
//例子:
pod trunk register blackstar_lang@163.com "BlackStar"
- 注冊(cè)成功后發(fā)布
pod trunk push xxxx.podspec --allow-warnings
- 發(fā)布成功后音婶,pod search xxxx 試試可不可以搜索出來(lái),如果確定發(fā)布成功了莱坎,但是搜不出來(lái),需要重置 pod的searchindex
cd ~/Library/Caches/CocoaPods/
//然后執(zhí)行
rm -rf search_index.json
重新 pod search 就可以了
有的時(shí)候我們?cè)趐od 上發(fā)布了寸士,但是又不想發(fā)布了檐什,想要發(fā)布到私有庫(kù)上,那么我們可以執(zhí)行以下操作弱卡,刪除公共庫(kù)中的組件
//查看自己的郵箱乃正,和發(fā)布過(guò)的公共庫(kù)
pod trunk me
//然后執(zhí)行命令刪除組件版本
pod trunk deprecate 組件名稱(chēng) 版本號(hào)
//例子:
pod trunk delete BSAFNetworking 0.0.1
//然后更新本地repo
pod repo update
然后發(fā)布到自己的庫(kù)
pod repo push xxxx地址 xxxx.podspec --allow-warnings
這就是此次發(fā)布pod的全過(guò)程了,如果你也遇到了問(wèn)題婶博,可以留言共同研究哦
補(bǔ)充報(bào)錯(cuò)解決方案
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
) during validation.
解決辦法:將Xcode的line Tools 打開(kāi)設(shè)置上即可