在Flutter開發(fā)的過(guò)程中也會(huì)遇到三方庫(kù)管理的問題乃正,有些三方庫(kù)需要進(jìn)行再定制谦铃,我們會(huì)fork一份下來(lái)進(jìn)行維護(hù)啦辐,此外也有一些私有組件不適合上傳到公有倉(cāng)庫(kù)卓嫂,于是就有了自己搭建私有pub庫(kù)的需求慷暂。這篇文章主要介紹如何搭建私有化pub倉(cāng)庫(kù),及在搭建私有pub倉(cāng)庫(kù)過(guò)程中的探索晨雳。首先進(jìn)行準(zhǔn)備工作呜呐,創(chuàng)建一個(gè)package,之后用它來(lái)進(jìn)行上傳到公有倉(cāng)庫(kù)和私有倉(cāng)庫(kù)悍募,在這個(gè)過(guò)程中會(huì)介紹怎么創(chuàng)建公有倉(cāng)庫(kù)和私有倉(cāng)庫(kù)蘑辑。
1.準(zhǔn)備package
首先介紹一下pub倉(cāng)庫(kù),pub倉(cāng)庫(kù)里存放的是開發(fā)者提交的Package坠宴,Package包含以下兩種類別:
? 純 Dart 庫(kù):用 Dart 編寫的傳統(tǒng) package洋魂,比如 path。其中一些可能包含 Flutter 的特定功能喜鼓,因此依賴于 Flutter 框架副砍,其使用范圍僅限于 Flutter,比如 fluro庄岖。
? 原生插件:使用 Dart 編寫的豁翎,按需使用 Java 或 Kotlin、ObjC 或 Swift 分別在 Android 和/或 iOS 平臺(tái)實(shí)現(xiàn)的 package隅忿。一個(gè)具體的例子是 battery心剥。
詳情可以參考Flutter Packages 的開發(fā)和提交,里面對(duì)于package的介紹背桐。
想要提交自己的package优烧,那么咱們就先創(chuàng)建一個(gè)吧。
// 創(chuàng)建純dart插件 package
flutter create --template=package hello
// 創(chuàng)建原生插件 package
flutter create --org com.example --template=plugin hello
r咱們就以復(fù)雜的為例链峭,創(chuàng)建一個(gè)包含原生插件的package畦娄,在終端輸入以上指令,或者可以直接通過(guò)Android Studio來(lái)創(chuàng)建。
創(chuàng)建好之后熙卡,一個(gè)最簡(jiǎn)單的package就生成了杖刷,如果上傳到pub倉(cāng)庫(kù)的話,就可以讓其他開發(fā)者輕松使用啦驳癌。
package的目錄如下挺勿,我創(chuàng)建了一個(gè)叫做dh_plugin的package,作為下面操作的例子:
提交之前喂柒,請(qǐng)確保 pubspec.yaml
、README.md
以及 CHANGELOG.md
文件已被審查禾嫉,以保證其內(nèi)容的完整性和正確性灾杰。
其中最主要的是pubspec.yaml
的編寫,參考Pubspec 文件熙参,當(dāng)然其中的設(shè)置不會(huì)全用艳吠,一個(gè)最簡(jiǎn)單的pubspec.yaml
只需要包含以下幾項(xiàng)即可:
name: dh_plugin
description: plugin test
version: 0.0.1
author: 作者 <郵箱> (或者 authors: )
environment:
sdk: ">=2.1.0 <3.0.0"
homepage: 介紹當(dāng)前package地址
可以通過(guò)dry-run
命令以檢驗(yàn)是否所有內(nèi)容都通過(guò)了分析:
bogon:dh_plugin whqfor$ flutter packages pub publish --dry-run
Publishing dh_plugin 0.0.3 to https://pub.flutter-io.cn:
···
Package has 0 warnings.
其中出現(xiàn)一兩處warning也可以,只要沒有error即可孽椰。
到此package的準(zhǔn)備工作就做好了昭娩,接下來(lái)就可以準(zhǔn)備上傳了。
2.公有倉(cāng)庫(kù)
介紹搭建私有倉(cāng)庫(kù)之前黍匾,咱們先看下公有倉(cāng)庫(kù)如何搭建栏渺,其發(fā)布
流程差不多,主要差異在于倉(cāng)庫(kù)的搭建
锐涯,當(dāng)然如果不關(guān)心公有庫(kù)的話也可以略過(guò)這部分不看磕诊。
通過(guò)dry-run
命令的檢查后,開始上傳吧纹腌,上傳命令去掉dry-run
就是了
bogon:dh_plugin whqfor$ flutter packages pub publish
Publishing dh_plugin 0.0.3 to https://pub.flutter-io.cn:
···
Looks great! Are you ready to upload your package (y/n)?
輸入y
Pub needs your authorization to upload packages on your behalf.
In a web browser, go to https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&response_type=code&client_id=818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A60578&scope=openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email
Then click "Allow access".
Waiting for your authorization...
如果環(huán)境搭建好的情況下霎终,到這里上傳公有package的流程就到此結(jié)束了。
不過(guò)你可能會(huì)有疑問package上傳到哪里了吶升薯?
這就和上面長(zhǎng)長(zhǎng)的一串a(chǎn)uthorization 地址有關(guān)聯(lián)了莱褒,從 https:// 開始拷貝直到userinfo.email結(jié)束,復(fù)制到瀏覽器中去涎劈。瀏覽器會(huì)根據(jù)鏈接帶著的信息進(jìn)行解析广凸,選擇你的google賬號(hào)進(jìn)行登錄,之后就會(huì)看到
Pub Authorized Successfully
The pub client has been successfully authorized. You may now use it to upload packages and perform other tasks.
終端的進(jìn)度也會(huì)變成蛛枚,開始上傳啦
Waiting for your authorization...
Authorization received, processing...
等等炮障,前面提到輸入google賬號(hào)...
是的,還需要?jiǎng)?chuàng)建一個(gè)a verified publisher
賬號(hào)坤候,發(fā)布 package
To create a verified publisher, follow these steps:
1 Go to pub.dev.
2 Log in to pub.dev using a Google Account.
3 In the user menu in the top-right corner, select Create Publisher.
4 Enter the domain name that you want to associate with your publisher (for example, dart.dev), and click Create Publisher.
5 In the confirmation dialog, select OK.
6 If prompted, complete the verification flow, which opens the Google Search Console.
? When adding DNS records, it may take a few hours before the Search Console reflects the changes.
? When the verification flow is complete, return to step 4.
一般的開發(fā)者可能會(huì)卡在第4步胁赢,需要域名認(rèn)證。
在pub.dev登錄之后白筹,點(diǎn)擊自己的頭像 creat publisher
智末,出現(xiàn)如下界面
輸入域名谅摄,之后按照提示進(jìn)行驗(yàn)證
選擇自己的驗(yàn)證方式,我選擇是dns驗(yàn)證系馆,將txt記錄添加到dns解析中送漠。
創(chuàng)建好了之后可以在pub.dev進(jìn)行管理packages也可以進(jìn)行組員管理。
有沒有覺得好麻煩由蘑,publisher創(chuàng)建終于告一段落闽寡。
剛才上傳怎么樣了吶?失敗了...
Waiting for your authorization...
Authorization received, processing...
It looks like accounts.google.com is having some trouble.
Pub will wait for a while before trying to connect again.
OS Error: Operation timed out, errno = 60, address = accounts.google.com, port = 61646
pub finished with exit code 69
bogon:dh_plugin whqfor$
雖然瀏覽器通過(guò)各種手段翻·墻成功尼酿,但是終端還不能翻·墻爷狈,可以在終端ping google.com
試試通不通,配置終端翻·墻在這里阻塞了半天裳擎,google 搜索終端翻·墻
的前10個(gè)方法都試了一遍還是沒有配置好涎永,如果你知道歡迎交流一下。
這是由于瀏覽器是通過(guò)傳輸層(第四層)ssr的socks代理鹿响,終端ping走的是網(wǎng)絡(luò)層(第三層)協(xié)議問題解釋羡微。
好吧,可能到這里就要放棄了吧惶我。
先別走妈倔,看看私有倉(cāng)庫(kù)怎么創(chuàng)建吧,不用經(jīng)過(guò)認(rèn)證绸贡,秒上傳启涯。
3.私有倉(cāng)庫(kù)
如果你搭建好了私有倉(cāng)庫(kù),上傳私有package和公有package流程差別不大恃轩。只是在pubspec.yaml
多了一個(gè)字段publish_to
標(biāo)識(shí)私有倉(cāng)庫(kù)地址结洼。
完整的pubspec.yaml
如下
name: dh_plugin
description: plugin test
version: 0.0.1
author: 作者 <郵箱> (或者 authors: )
publish_to: http://10.29.32.176:8080
environment:
sdk: ">=2.1.0 <3.0.0"
homepage: 介紹當(dāng)前package地址
首先我們需要搭建私有服務(wù)器,官方demo在此pub_server
按照pub_server
的介紹搭建本地服務(wù)之后叉跛,就可以將package上傳私有倉(cāng)庫(kù)啦松忍,保持私有主機(jī)pub_server運(yùn)行不要關(guān)機(jī)。
注意這個(gè)默認(rèn)地址是本地地址筷厘,如果想其他人也可以進(jìn)行訪問的話鸣峭,需要將這個(gè)地址進(jìn)行修改。
修改方式如下圖酥艳,將localhost
改為私有庫(kù)所在主機(jī)的ip地址即可摊溶。
修改pub_server源碼:
在啟動(dòng)pub_server之后就可以發(fā)布啦,
發(fā)布指令為
flutter packages pub publish --server=http://10.29.XX.XXX:8080
Waiting for your authorization...
Authorization received, processing...
It looks like accounts.google.com is having some trouble.
Pub will wait for a while before trying to connect again.
OS Error: Operation timed out, errno = 60, address = accounts.google.com, port = 50135
pub finished with exit code 69
不出意外還是出錯(cuò)充石,這是因?yàn)樗接袀}(cāng)庫(kù)也是需要經(jīng)過(guò)publisher驗(yàn)證莫换,被墻害苦了,那么自己的私有倉(cāng)庫(kù)能夠不進(jìn)行publisher驗(yàn)證嗎?答案是可以的拉岁。
Flutter是完全開源的坷剧,那咱們首先看看pub工具怎么實(shí)現(xiàn)的,找到/Users/whqfor/Flutter/flutter/bin/cache/dart-sdk/bin/pub
喊暖,用文本編輯器打開
# Run the pub snapshot.
DART="$BIN_DIR/dart"
if array_contains "--no-preview-dart-2" "${VM_OPTIONS[@]}"; then
echo "Pub no longer supports Dart 1"
exit -1
else
SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
fi
pub執(zhí)行的其實(shí)是個(gè)pub.dart.snapshot
文件惫企,pub的源碼github也有,把里面的官方驗(yàn)證去掉不就可以了嗎陵叽?
這里感謝ameryzhu的文章指明了關(guān)鍵點(diǎn)替換oauth2狞尔。大家可以fork他的修改,然后使用fork的源碼生成自己的mypub.dart.snapshot
文件即可巩掺。放到pub.dart.snapshot
文件同目錄偏序,然后修改以上pub源碼,將
SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot
改為自己生成的SNAPSHOT="$BIN_DIR/snapshots/mypub.dart.snapshot
锌半。
怎么生成snapshot,以及什么是snapshot可以看這里寇漫,可以使用這個(gè)指令:
dart --snapshot=<output_file> <dart_file>
例子:
dart --snapshot=mypub.dart.snapshot /Users/whqfor/Desktop/Pub/pub-master/bin/pub.dart
生成的 mypub.dart.snapshot默認(rèn)在當(dāng)前目錄/Users/whqfor/下刊殉。將mypub.dart.snapshot放置到和pub.dart.snapshot同目錄。
到此構(gòu)建pub私有庫(kù)的流程結(jié)束啦州胳。
再來(lái)發(fā)布一次
bogon:dh_plugin whqfor$ flutter packages pub publish --server=http://10.29.32.176:8080
Publishing dh_plugin 0.0.4 to http://10.29.32.176:8080:
···
Suggestions:
* ./CHANGELOG.md doesn't mention current version (0.0.4).
Consider updating it with notes on this version prior to publication.
Package has 1 warning. Upload anyway (y/n)? y
Uploading...
Successfully uploaded package.
秒傳有沒有记焊。
那么怎么使用私有庫(kù)吶?dependencies
dependencies:
transmogrify:
hosted:
name: transmogrify
url: http://some-package-server.com
version: ^1.0.0
在本demo中對(duì)應(yīng)的即是
dh_plugin:
hosted:
name: dh_plugin
url: http://10.29.XX.XXX:8080
version: 0.0.4
注意事項(xiàng):更細(xì)package時(shí)栓撞,版本號(hào)變化遍膜,記得也更新CHANGELOG.md
例如:
## 0.0.1
* TODO: Describe initial release.
## 0.0.2
* 更換pub_server ip地址
## 0.0.3
* 修改一點(diǎn)內(nèi)容驗(yàn)證是否成功
好啦,感謝看到這里瓤湘,如有疑問歡迎與我交流瓢颅。
幾個(gè)問題:
1.更改默認(rèn)snapshot影響公有package使用嗎?
經(jīng)過(guò)自測(cè)不影響
2.pub源碼怎么同步
這個(gè)問題沒有太好的答案弛说,定期merge官網(wǎng)更新吧挽懦,可以參考咸魚的方案,還在研究木人。
3.自己的package發(fā)布到那里了吶信柿?
在隱目錄/Users/whqfor/.pub-cache/hosted/
中帶ip地址和8080端口的文件中。