以創(chuàng)建一個(gè)名為 MAMonitor 的庫(kù)為準(zhǔn)没佑。
一褐奴、創(chuàng)建兩個(gè) git 庫(kù)
MAMonitor(私有庫(kù)項(xiàng)目名稱:https://github.com/xxx/MAMonitor)
MAMonitorSpec(私有庫(kù)索引庫(kù)名稱:https://github.com/mayuee/MAMonitorSpec)
這個(gè)庫(kù)用來保存私有庫(kù)的 podspec文件桩盲,一般起名xxxSpec。這個(gè)庫(kù)不存放代碼述雾,而是包名驳庭、版本號(hào)分門別類的存放所有的有關(guān)私有庫(kù)的配置。
復(fù)制倉(cāng)庫(kù) git 地址 執(zhí)行命令:
pod repo add MAMonitorSpec https://github.com/xxx/MAMonitorSpec
查看是否添加成功:
pod repo list
二柔纵、創(chuàng)建本地私有庫(kù)
cd xxx/MAMonitor //自定義要?jiǎng)?chuàng)建的(本地存放)私有庫(kù)的文件夾
pod lib create MAMonitor //MAMonitor :私有庫(kù)項(xiàng)目名稱
執(zhí)行如下缔杉,按需選擇
Press return to continue.
1.平臺(tái)
What platform do you want to use?? [ iOS / macOS ]
> iOS
2.語(yǔ)言
What language do you want to use?? [ Swift / ObjC ]
> ObjC
3. 是否集成Demo為自己的模塊庫(kù)?
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
4. 是否集成測(cè)試框架?
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
5. 是否基于View的做測(cè)試?
Would you like to do view based testing? [ Yes / No ]
> Yes
6. 類的前綴
What is your class prefix?
> M
執(zhí)行完畢后創(chuàng)建了一個(gè)工程
將Classes文件夾下面的ReplaceMe.m文件刪除掉,替換成自己要上傳的私有庫(kù)的代碼搁料,然后更新一下這個(gè)工程的pod庫(kù)
- cd到Example文件下
- 執(zhí)行 pod install
修改podspec
文件
這里是:MAMonitor項(xiàng)目下的MAMonitorSpec.podspec 文件
#
# Be sure to run `pod lib lint MAMonitor.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'MAMonitor'
s.version = '0.1.0'
s.summary = 'A short description of MAMonitor.'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/xxx/MAMonitor'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xxx' => 'xxx@163.com' }
s.source = { :git => 'https://github.com/xxx/MAMonitor.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '10.0'
# “*” 表示匹配所有文件或详,“**” 表示匹配所有子目錄
s.source_files = 'MAMonitor/Classes/**/*'
# s.resource_bundles = {
# 'MAMonitor' => ['MAMonitor/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
需要修改的項(xiàng)
- 修改版本號(hào)
- 修改項(xiàng)目的簡(jiǎn)單概述和詳細(xì)描述
- 修改homepage
s.homepage = 'https://github.com/xxx/MAMonitor'
改為
s.homepage = 'https://github.com/gitxxx/MAMonitor.git'
注意:s.homepage需要設(shè)置剛創(chuàng)建的私有代碼倉(cāng)庫(kù)的地址, 不是私有索引庫(kù)的地址!9啤霸琴!
- 修改source地址
s.source = { :git => 'https://github.com/xxx/MAMonitor.git', :tag => s.version.to_s }
改為
s.source = { :git => 'https://github.com/gitxxx/MAMonitor.git', :tag => s.version.to_s }
注意:s.source 需要設(shè)置的是私有代碼倉(cāng)庫(kù)的源地址(選擇使用HTTPS地址)!U焉臁梧乘!
- 添加依賴庫(kù),這里添加
UIKit
s.frameworks = 'UIKit'
三、將私有庫(kù)push到遠(yuǎn)程倉(cāng)庫(kù)
編譯通過后选调,提交代碼到私有庫(kù)的git倉(cāng)庫(kù)地址 并打tag
git status -- 查看當(dāng)前git存了什么文件
git add . -- 將所有文件緩存到待提交文件區(qū)域
git commit -m "上傳組件" -- 提交文件夹供,寫上備注
git remote add origin <私有庫(kù)git倉(cāng)庫(kù)地址(https://github.com/gitxxx/MAMonitor.git)>
git pull origin master // 把遠(yuǎn)程倉(cāng)庫(kù)的文件更新到本地
git push -u origin master -- 將代碼推送到遠(yuǎn)程私有庫(kù)git倉(cāng)庫(kù)的master分支
git tag <版本號(hào)(例如git tag 0.1.0)> --這里的版本號(hào)必須和podspec里面寫的版本號(hào)一致)
git push -- tags
四、本地校驗(yàn)
到本地私有庫(kù)目錄下:cd <本地私有庫(kù)目錄下(例如:cd MAMonitor)>
執(zhí)行驗(yàn)證:pod lib lint --allow-warnings
若組件依賴第三方庫(kù)仁堪,需要將第三方庫(kù)索引地址寫上
pod lib lint --sources="cocoapods庫(kù)地址哮洽,私有庫(kù)遠(yuǎn)程地址" --allow-warnings
若組件依賴的第三方庫(kù)又依賴了其他的庫(kù),需要命令如下
pod lib lint --sources="cocoapods庫(kù)地址弦聂,私有庫(kù)遠(yuǎn)程地址" --use-libraries --allow-warnings
@localhost MAMonitor % pod lib lint --allow-warnings
-> MAMonitor (0.1.0)
- WARN | summary: The summary is not meaningful.
- WARN | url: There was a problem validating the URL https://github.com/mayuee/MAMonitor.git.
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Building targets in parallel
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | [iOS] xcodebuild: note: Planning build
- NOTE | [iOS] xcodebuild: note: Constructing build description
MAMonitor passed validation.
到這里鸟辅,本地校驗(yàn)通過。
五莺葫、遠(yuǎn)程校驗(yàn)
先創(chuàng)建一個(gè) Release版本剔桨,基于前面創(chuàng)建的 tag 0.1.0。
最后點(diǎn)擊 · Publish·
遠(yuǎn)程校驗(yàn)和本地校驗(yàn)類似徙融,只要把lib
字段改成spec
pod spec lint --sources="cocoapods庫(kù)地址,私有庫(kù)遠(yuǎn)程地址" --use-libraries --allow-warnings
例如:
pod spec lint --sources="https://github.com/gitxxx/MAMonitor.git" --use-libraries --allow-warnings
如下則表示驗(yàn)證通過了瑰谜。
% pod spec lint --sources="https://github.com/xxxx/MAMonitor.git" --use-libraries --allow-warnings
-> MAMonitor (0.1.0)
- WARN | summary: The summary is not meaningful.
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Building targets in parallel
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | [iOS] xcodebuild: note: Planning build
- NOTE | [iOS] xcodebuild: note: Constructing build description
Analyzed 1 podspec.
MAMonitor.podspec passed validation.
其間有幾次報(bào)錯(cuò)
fatal: unable to access 'https://github.com/mayuee/MAMonitor.git/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
試了幾個(gè)網(wǎng)絡(luò)上的方案欺冀,最靠譜的方案是 多試幾次。萨脑。隐轩。。
六渤早、提交索引文件到遠(yuǎn)程索引庫(kù)
所有驗(yàn)證通過之后职车,要將spec文件推送到最開始創(chuàng)建的私有庫(kù)索引庫(kù)當(dāng)中
cd 到私有庫(kù)項(xiàng)目目錄(例如:cd MAMonitor)
pod repo push <本地索引庫(kù)名稱> <索引文件名> --verbose --allow-warnings
例如:pod repo push MAMonitorSpec MAMonitor.podspec --verbose --allow-warnings
注意:<本地索引庫(kù)名稱>是
/Users/XXX/.cocoapods/repos
下的私有庫(kù)索引項(xiàng)目名稱
<索引文件名> 就是以podspec
結(jié)尾的
推送成功后,在本地索引庫(kù)中如下圖
添加成功后鹊杖,索引庫(kù) MAMonitorSpec
中會(huì)自動(dòng)出現(xiàn) MAMonitor
悴灵,MAMonitor
中只包含 MAMonitor.podspec
文件。
七骂蓖、驗(yàn)證私有庫(kù)
- pod repo update 先更新一下pod庫(kù)
這一步報(bào)錯(cuò):
[!] CDN: trunk Repo update failed - 123 error(s):
CDN: trunk URL couldn't be downloaded: https://cdn.cocoapods.org/AlgoliaSearch.yml Response: Timeout was reached
- 解決報(bào)錯(cuò)權(quán)宜方法
//移除了文件夾 /Users/user/.cocoapods/repos/trunk
pod repo remove trunk
重新安裝 //或更新
pod install // or pod update這樣改了之后积瞒, 工程的 Podfile 里需要添加一句話
source 'https://github.com/CocoaPods/Specs.git'
- 搜索私有庫(kù)
pod search MAMonitor
-> MAMonitor (0.1.0)
A short description of MAMonitor.
pod 'MAMonitor', '~> 0.1.0'
- Homepage: https://github.com/xxxx/MAMonitor.git
- Source: https://github.com/gitxxx/MAMonitor.git
- Versions: 0.1.0 [MAMonitorSpec repo]
(END)
八、其他項(xiàng)目使用私有庫(kù)
新建 demo 工程登下,使用pod安裝 MAMonitor
庫(kù)
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/gitxxx/MAMonitor.git'
target 'demo' do
use_frameworks!
pod 'MAMonitor'
end
執(zhí)行 pod install
(pod update)報(bào)錯(cuò)
[!] Unable to add a source with url `https://github.com/CocoaPods/Specs.git` named `cocoapods`.
You can try adding it manually in `/Users/mazhibao/.cocoapods/repos` or via `pod repo add`.
這是因?yàn)榍懊嬉瞥?repos目錄下的原本默認(rèn)的 trunk茫孔,但是master 沒有,后面需要手動(dòng)添加被芳,解決方案:
1缰贝、cd ~/.cocoapods/repos
2、git clone https://github.com/CocoaPods/Specs.git master
移除項(xiàng)目下的 pods(如果已經(jīng)生成的話) 文件夾畔濒,重新 pod install
九剩晴、更新
對(duì)已有庫(kù)進(jìn)行更新,需要?jiǎng)?chuàng)建新的 Release
版本侵状,更改 MAMonitor.podspec
文件版本號(hào)李破,重新執(zhí)行 pod repo push MAMonitorSpec MAMonitor.podspec --verbose --allow-warnings
即可宠哄。
————————————————
其他
- 驗(yàn)證
podspec
:執(zhí)行:pod spec lint --allow-warnings
- 刪除原來的
tag 0.0.1
git tag -d 0.0.1 //刪除本地 tag
git push origin :refs/tags/0.0.1 //刪除遠(yuǎn)程 tag
清理pod緩存:
pod cache clean MAMonitor
如果私有庫(kù)組件庫(kù)過多,需要分層文件夾顯示嗤攻,則需要使用
subspec
:
#spec.source_files = "Classes", "Classes/**/*"
#spec.resources = "Resources/*.png"
#spec.source_files = "Classes", "Classes/**/*.{h,m}"
#spec.exclude_files = "Classes/Exclude"
spec.subspec 'GOImagesCarouselView' do |s|
s.source_files = "Classes/GOImagesCarouselView/**/*"
s.resources = "Resources/GOImagesCarouselView/*.png"
end
毛嫉??妇菱?
- git push 承粤,在輸入 Username 和 Password 之后,Github 返回如下一個(gè)錯(cuò)誤
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xxxx/MAMonitor.git/'
查資料闯团,大概意思就是辛臊,以前的密碼認(rèn)證從2021年8月13日開始就不能用了,必須使用個(gè)人訪問令牌(personal access token)房交,即就是把密碼替換成token彻舰。
背景是近年來,GitHub 客戶受益于 GitHub.com 的多項(xiàng)安全增強(qiáng)功能候味,例如雙重身份驗(yàn)證刃唤、登錄警報(bào)、驗(yàn)證設(shè)備白群、防止使用泄露密碼和WebAuthn 支持尚胞。這些功能使攻擊者更難獲取在多個(gè)網(wǎng)站上重復(fù)使用的密碼并使用它來嘗試訪問您的 GitHub 帳戶。盡管有這些改進(jìn)帜慢,但由于歷史原因笼裳,未啟用雙因素身份驗(yàn)證的客戶仍然能夠僅使用其 GitHub 用戶名和密碼繼續(xù)對(duì) Git 和 API 操作進(jìn)行身份驗(yàn)證。
從 2021 年 8 月 13 日開始粱玲,在對(duì) Git 操作進(jìn)行身份驗(yàn)證時(shí)將不再接受帳戶密碼躬柬,并將要求使用基于令牌的身份驗(yàn)證,例如個(gè)人訪問令牌(針對(duì)開發(fā)人員)或 OAuth 或 GitHub 應(yīng)用程序安裝令牌(針對(duì)集成商)適用于 GitHub.com 上所有經(jīng)過身份驗(yàn)證的 Git 操作抽减。您也可以在您喜歡的地方繼續(xù)使用 SSH 密鑰楔脯。
與基于密碼的身份驗(yàn)證相比,令牌提供了許多安全優(yōu)勢(shì):
- 唯一 —— 令牌特定于 GitHub胯甩,可以按使用或按設(shè)備生成
- 可撤銷 —— 令牌可以隨時(shí)單獨(dú)撤銷昧廷,無(wú)需更新未受影響的憑據(jù)
- 有限 —— 令牌的范圍可以很窄,只允許用例所需的訪問權(quán)限
- 隨機(jī) —— 令牌不受字典類型或暴力嘗試的影響偎箫,您需要記住或定期輸入的更簡(jiǎn)單的密碼可能是
問題解決
- 找到個(gè)人Settings頁(yè)面:
-
找到Developer settings木柬,選擇個(gè)人訪問令牌Personal access tokens,然后選中生成令牌Generate new token
-
設(shè)置token的特性淹办,比如:標(biāo)題眉枕,有效期,token權(quán)限等等
- 點(diǎn)擊最下面 生成令牌
Generate token
把token復(fù)制下來
之后提交代碼的時(shí)候,在之前輸入密碼的地方輸入這個(gè)token就可以了速挑。
也可以 把token直接添加遠(yuǎn)程倉(cāng)庫(kù)鏈接中谤牡,這樣就可以避免同一個(gè)倉(cāng)庫(kù)每次提交代碼都要輸入token了:
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
- <your_token>:換成你自己得到的token
- <USERNAME>:是你自己github的用戶名
- <REPO>:是你的倉(cāng)庫(kù)名稱
還有一點(diǎn),新創(chuàng)建的repo里面姥宝,默認(rèn)分支是 main
不是 master
了