背景
一開始是打算創(chuàng)建私有庫的,但公司git需要內(nèi)網(wǎng)VPN訪問,git上的私有庫又要錢,所以就拿了個公有庫做測試(私有庫的搭建大同小異),測試的主題是自定義SDK文件并上傳cocoaPods,也在網(wǎng)上搜索了很多參考資料,不過感覺都是在對同一份博客的不斷copy,也不清楚他們自身有沒有嘗試過,不過我嘗試是沒成功的,多方碰壁之后自己整理了下思路,至少在第三方庫提交上,希望給其他人一些幫助,流程是參照的這份博客:cocoaPods創(chuàng)建公開公共庫,內(nèi)容有針對自己的情況做了特殊處理,尤其SDK中涉及不少用c語言寫的代碼,廢話不多說了,進入正題。
正題
1、首先電腦安裝cocoaPods,并有g(shù)it賬號
2、打開終端,cd <文件目錄地址>(任意文件夾地址,可以是桌面),進入指定文件夾,本文測試文件夾名XRGcSDKPods
cd /Users/xry/Desktop/XRGcSDKPods
3、在你進入的目錄下從cocoaPod官方下載一個模版,我這邊是從無到有建的demo,有現(xiàn)成工程的情況沒測試,后續(xù)文章會更新。
pod lib create XRGcSDKPods
4、緊接著會提示輸入一些信息:
What is your email?
//這是輸入你開源中國申請的git郵箱賬號
What platform do you want to use?? [ iOS / macOS ]
// 這里輸入你使用的平臺
> iOS
What language do you want to use?? [ Swift / ObjC ]
//這里輸入你使用的語言
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
//這里輸入你是否需要生成一個 demo 應(yīng)用
//這里最好 Yes 這樣你可以查看你創(chuàng)建的庫是否可以使用
> NO
Which testing frameworks will you use? [ Specta / Kiwi / None ]
// 這里輸入你需要用到的測試框架,隨意選
> None
Would you like to do view based testing? [ Yes / No ]
//是否做基于視圖的測試 Yes/No 都可以
> No
What is your class prefix?
//輸入前綴
> XR
回車之后會在我們cd的目錄下幫我們創(chuàng)建好一個xcode模版,以下是我生成的項目文件夾層級結(jié)構(gòu):

5、在 Example 文件下會有一個 供我們測試使用的 demo 打開 .xcworkspace文件(如果我們的 cocoapods 安裝的有問題那么不會生成這個文件,但是會有一個Podfile文件,我們在終端中輸入命令行:cd Example 的文件目錄 ,再次輸入命令行:pod install, 之后會幫我們生成一個 .xcworkspace文件,這里需要關(guān)閉原來打開的 demo 文件入后使用 工程名.xcworkspace 打開)

6、 配置信息,在 demo 工程中有一個 Podspec Metadata 文件夾,查看里面的白文件:
工程名. podspec 配置里面的信息,這個根據(jù)具體情況自行配置,也是這篇文章與原文件不同的地方之一,先貼出一張配置信息截圖,下文有字段說明:
下面提到的字段不是一定要都用到的,大部分基本都用不到,這里做說明也是因人而異,用適合自己工程的
s.name = 'XRGcSDKPods'#這里是工程的名字s.version = '0.1.0'#這里是公共庫的版本號s.summary = 'A short description of MyTestSecondLibrary.'#這里對你寫的庫進行簡要的概述一下s.description = <<-DESC
TODO: Add long description of the pod here.
DESC#這里對你寫的庫進行具體的使用方法說明及其他描述s.homepage = 'https://github.com/yuanxunrui/XRGcSDKPods'# 你git庫的地址首頁,可以在開元中國創(chuàng)建你的庫,不需要使用什么初始化方法,不要勾選 readme
homepages.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'# 屏幕快照的地址,例如演示的 gif 文件s.license = { :type => 'MIT', :file => 'LICENSE' }#許可證,type-類型;file-文件,這里不需要改變,使用默認,文件指向的文件名與工程中文件名要一致。s.author = { 'yuanxunrui' => 'xxxx.com' }#作者信息:賬戶名,賬戶郵箱地址s.source = { :git => 'https://github.com/yuanxunrui/XRGcSDKPods.git', :tag => s.version.to_s }# 這里輸入郵箱如果你在開元中國申請的 git 賬號,那么把你在開元中國創(chuàng)建的項目的 https 網(wǎng)址輸入到這里,s.social_media_url= 'https://twitter.com/<TWITTER_USERNAME>' #s.ios.deployment_target = '9.0'#iOS 支持的最低級別,這里最低9.0s.source_files = 'XRGcSDKPods/Classes/**/*'#你庫文件存放的目錄位置,這里通過文件 項目名.xcodeworkspace 打開 xcode,如今打了 pods -> Development Pods -> 工程名 -> 工程名 -> Classes 在 Classes 這個文件夾下我們存放我們創(chuàng)建的類文件(.h,.m文件)s.vendored_frameworks = 'XRGcSDKPods/Classes/*.framework'#靜態(tài)庫文件的依賴,意思是執(zhí)行到Classes文件夾下檢索.framework類型的文件,該demo上傳的是一個SDK靜態(tài)庫文件,所以此處需要加上這個字段說明,否則編譯不通過,如果你上傳的pod中有靜態(tài)庫文件的話,你得用上此字段做標(biāo)注s.libraries = "c++"# 該pod依賴的系統(tǒng)資源文件,demo中涉及到c語言代碼,所以此處需引入c++系統(tǒng)資源庫s.frameworks = 'UIKit', 'Foundation'#這里輸入需要用到的依賴庫,如果沒有特別的需要可以不用輸入直接注釋掉
-s.public_header_files = 'Pod/Classes/**/*.h'#頭文件目錄s.dependency 'AFNetworking', '~> 2.3'# 如果你的公共庫需要依賴其他庫,那么打開這里的注釋,例如AFNetworking,如果有多個,則依次往后排s.resource_bundles= { # 這里存放的 bundle 文件,例如:
'bundle名稱' => ['bundle名稱/Assets/*.png']# 這里放的 png 圖片的資源文件,如果還想使用 storyboard,xib,imageset 文件的話,可以如下面的方法寫>'bundle名稱' => ['bundle名稱/Assets/*.{png,xib,storyboard,imageset}'], 【注意】 如果我們使用 xib , storyboard , 圖片等資源的時候文件必須強制性放到 Assets 文件夾下,這個文件夾在初始化的時候,并沒有顯示在工程中,不過可以通過 show in Finder classes 文件查看,發(fā)現(xiàn)里面有一個同級別的文件夾 Assets , 我們把我們創(chuàng)建的資源文件拖入到這個文件夾下,然后重新在終端中輸入命令行: cd .../Example,然后pod install 再次查看會發(fā)現(xiàn) Assets 文件夾與 classes 同時存在 }s.user_target_xcconfig = {'OTHER_LDFLAGS' => ['-lObjC','-all_load']}#build setting的配置s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' }#設(shè)置不支持bitcodes.user_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' }#設(shè)置不支持bitcode
路徑描述中的
*&**說明
*匹配所有文件c*匹配所有以c開頭的文件*c匹配所有以c結(jié)尾的文件*c*匹配所有包含c的文件**遞歸匹配所有子文件夾
7、 在git上創(chuàng)建我們的遠程庫,輸入項目名稱,項目描述,選擇開發(fā)語言,我們做的是公開庫,這里選擇公開, 我們不要初始化這個工程,因為我們的工程是從本地上傳上去,所以三個初始化方式都不要勾選,然后點擊創(chuàng)建,完成我們遠程庫的創(chuàng)建

8、 然后獲取我們遠程項目庫的 https 地址,在第6步配置 s.name、s.source、s.homepage, 這里輸入我們在開元中國創(chuàng)建的遠程庫的 https 網(wǎng)址
9、在終端中輸入命令行,先關(guān)聯(lián)本地倉庫和遠程倉庫
cd “你工程文件夾名(Example 的上層)”
git add .
git commit -m "自定義提交信息"
git remote add origin "你工程遠程倉庫的地址,也就是你在git上創(chuàng)建的項目倉庫地址"
10、校驗我們第六步的配置信息
這里有兩個指令,一個是本地校驗(lib),一個是遠程校驗(spec),當(dāng)出現(xiàn)passed validation.時表示校驗通過,此處先進行本地校驗,看看本地配置是否有問題,在提交遠程的時候需要進行遠程校驗
本地校驗
$ pod lib lint --allow-warnings
本地校驗截圖
11、添加信任
在pod上注冊你的git賬號,兩種方案(一繁一簡),終端命令:
pod trunk register git賬號(郵箱) '名稱' --description='描述內(nèi)容隨意寫'-
pod trunk register git賬號(郵箱)簡化版
說明
- 1、 git賬號郵箱,是你在開源中國申請的 git 賬號
- 2、'名稱',可以是你的賬號昵稱,也可以是你的真是名稱,也可以不寫
- 3、 descrition=''這里可以隨意填寫也可以不寫
如果出現(xiàn)
Please verify the session by clicking the link in the verification email that has been sent to ‘你的郵箱’
去你自己的郵箱拷貝發(fā)送的網(wǎng)絡(luò)連接并打開,出現(xiàn)You can go back to your terminal now.說明驗證成功,以后你這臺設(shè)備,以及這個賬號就不要再次驗證了,如果你有多個賬號,這個方法也是在告訴你的 git 推送你的庫到哪個賬號上去
命令:pod trunk me可在終端查看驗證是否通過
12、提交項目到遠程庫
在提交之前最好先進行遠程校驗pod spec lint,直到出現(xiàn)passed validation.時
這個過程可能會重現(xiàn)這樣那樣的問題,會在后面常見問題中描述
13、推送版本號
這里必須先推送項目,之后推送版本號,順序不能錯
-
git tag "0.1.0"這個版本要要與你podspec文件中定義的版本號一致 -
git push --tags推送版本號
這樣就能在遠程看到我們的版本號了
版本號
14、所有配置完成后
把我們創(chuàng)建好的工程推送到 git
pod trunk push 工程名.podspec --allow-warnings
- --allow-warnings 可以不加,加了最好,如果你的配置文件有警告,那么無法推送成功
這時候需要等一會,有時候快,有時候慢,碰運氣了

15、測試公有庫
先配置工程profile pod 'XRGcSDKPods'
之后cd 進入你主工程目錄并執(zhí)行pod install,就能看到自己創(chuàng)建的pod了

常見問題分析
一、執(zhí)行pod spec lint遠程校驗的時候
大部分的問題應(yīng)該都集中在執(zhí)行pod spec lint(遠程校驗)的時候
1、找不到遠程倉庫branch版本號
-> XRGcSDKPods (0.1.0)
ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://github.com/yuanxunrui/XRGcSDKPods.git /var/folders/zd/4drz4mnn03l2wsc9r5pq4qrr0000gn/T/d20190118-90632-1j64qjr --template= --single-branch --depth 1 --branch 0.1.0
Cloning into '/var/folders/zd/4drz4mnn03l2wsc9r5pq4qrr0000gn/T/d20190118-90632-1j64qjr'...
warning: Could not find remote branch 0.1.0 to clone.
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.
問題1截圖
這種情況下就需要我們先將本地工程同步到遠程git倉庫,在同步之前先git pull以下,否則可能會因文件沖突報錯,下文對此情況也有說明
2、ERROR | [iOS] file patterns: The source_files pattern did not match any file.
pod repo lint 時報錯
這種情況一般是source_files路徑問題,路徑一般從有.podspec的那層開始
3、ERROR | unknown: Encountered an unknown error
造成這種錯誤的情況有很多,我這整理的也不全,大家也可以給我指點下,??
- 是否是遠程倉庫版本號獲取不到或者與spec文件中版本號不一致
- 當(dāng)前設(shè)備系統(tǒng)版本號低于配置文件中最低target版本號要求
- 配置文件中存在未聲明關(guān)鍵字段,比如homepage、name等
4、WARN | url: The URL (https://git.xxx/xxx/xxx) is not reachable.
這種情況一般是倉庫地址有問題
5、error: Invalid bitcode signature
error: Invalid bitcode signature
clang: error: linker command failed with exit code 1 (use -v to see invocation)
乍一看是bitcode的問題,但到buildsetting 中將bitcode 關(guān)掉后還是不可以。
這就要考慮是不是工程中其他文件的事了,demo工程中是包含了.framework文件,去看了下文件原工程,bitcode確實是YES,設(shè)置為NO重新生成一個再提交就OK了
二、本地倉庫上傳git遠程倉庫的時候
都知道在提交代碼之前先pull拉取以下,尤其是遠程倉庫非空的情況下,拿現(xiàn)在的這個例子說,雖然git端新建的是一個空的倉庫,但也默認生成了一個.gitignore文件,這就更需要在push之前先pull

1、Updates were rejected because the tip of your current branch is behind
執(zhí)行 git push時報錯,看錯誤是因為標(biāo)記的branch版本號落后

這個理論上執(zhí)行一次git pull就能解決了,但此處執(zhí)行git pull后再執(zhí)行依舊如此,所以此處嘗試了git提供的兩個方案之一git pull <remote> <branch>,此處我沒加版本號,因為現(xiàn)在遠程倉庫還沒有tag
執(zhí)行git pull https://github.com/yuanxunrui/XRGcSDKPods.git
發(fā)現(xiàn)出現(xiàn)了新的錯誤fatal: refusing to merge unrelated histories,見-問題2
2、fatal: refusing to merge unrelated histories
方案一:
在確定遠程倉庫沒有可用代碼的情況下可以直接忽略
git pull origin master --allow-unrelated-histories
方案二:
如果有有效文件沖突并解決的,一定要在合并后先執(zhí)行add . 、commit方法,然后再push
3、[!] There was an error pushing a new version to trunk: getaddrinfo: nodename nor servname provided, or not known
這里錯誤的原因是你沒有執(zhí)行提交版本號的方法,直接推送到 git
4、[!] Unable to accept duplicate entry for: 工程名 (0.1.0)
需要我們更改版本號,例如更改 xxx.podspec 白文件中的版本號 0.1.1,然后終端中重新提交版本信息也就是第13步的操作,最后執(zhí)行第14步操作
三、其他
1、如何刪除已提交的cocoaPod框架
pod trunk delete AFNetwroing '版本號'
2、用 pod search搜索時報錯
創(chuàng)建完后用pod search搜索搜索不到
Unable to find a pod with name, author, summary, or description matching
'你定義的庫'
這種情況一般是本地索引出了問題,可以通過重新創(chuàng)建索引解決(刪除本地索引,再次搜索時會自動重新創(chuàng)建)
rm ~/Library/Caches/CocoaPods/search_index.json
3、使用 pod install 找不到自己的庫
如果使用 pod install 無法找到你發(fā)布的公共庫,那么使用 pod update 嘗試,pod update 的作用是更新本地庫



