flutter packages 開發實戰——釋出失敗問題解決
Flutter 的庫是以 package 的方式來管理。Package 分為兩種,Dart package(也叫 library package) 和 plugin package。當我們說 Fluter 包的時候,指的其實也是 Dart 包,它只能使用 Dart 和 Flutter 提供的 API;而當我們說 Flutter 外掛時指的是後者,也就是 plugin package。Flutter 外掛通常會包含平臺特定的程式碼。對包的使用者來說,兩者沒有區別。
這裡我們建立一個package,併發布到dart倉庫上。
1、package開發過程
使用Android Studio新建一個flutter package專案
具體流程如下:
- 在選單上選擇 File -> New -> New Flutter Project。
- 在彈出的皮膚裡選擇 Flutter Package,點選 next。
- 填寫package的相關資訊,Project Name填入我們的專案名稱即可,其他資訊按需填寫。
具體如下圖。
具體業務開發
接下來就可以在lib/
包下寫我們自己package中的程式碼了。
本文的重點不在這兒,如需瞭解,具體請檢視Flutter學習指南:封裝 API 外掛——玉剛說等資料。
2、上傳資訊填寫
填寫使用者名稱、郵箱、個人主頁資訊
上傳之前,我們需要完善本地的配置資訊,具體在 pubspec.yaml
檔案中。我們在使用as新建專案時,這個檔案中已經自動生成了對應的資訊,我們只需要填寫使用者名稱、個人郵箱和主頁地址就好。
name: flutter_lifecycle_state
description: Make State support lifecycle method just like Android's Activity#onCreate、 Activity#onResume、Activity#onPause、Activity#onDestroy.
version: 0.0.1
author: tinytongtong<tinyvampire1102@gmail.com>
homepage: https://blog.csdn.net/qq_26287435
複製程式碼
這裡的name和description欄位的值,就是新建package對話方塊中填寫的資訊。
version欄位是用來發版的,每次發新版記得增加版本號。
author欄位中,填寫的是作者名稱和可用的Google郵箱,格式是username。需要注意的是,這個gmail郵箱需要保證可用。
homepage欄位,填寫的是個人主頁url即可,這裡我填寫的是我的csdn主頁。
LICENSE檔案
另外,釋出到 Pub 上的包需要包含一個 LICENSE,關於 LICENSE 檔案,最簡單的方法就是在 GitHub 建立倉庫的時候選中一個。
這裡我是從新建的github專案中貼上過來的。
檢查包的配置
我們在專案的根目錄
執行以下命令,檢測一下包的配置是否問題:
flutter packages pub publish --dry-run
複製程式碼
如果沒有問題,輸出如下:
...
Package has 0 warnings.
複製程式碼
釋出包
釋出包和上一步一樣,只是少了 --dry-run 引數:
flutter packages pub publish
複製程式碼
如果是第一次釋出,會提示驗證 Google 賬號。google賬號是以https:開頭,以.email結尾的地址
,防止因為地址不全導致開啟頁面錯誤。
授權後便可以繼續上傳,如果成功的話,會提示“Successful uploaded package”:
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=xxxxxxxxxxxxxx-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A52589&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email
Then click "Allow access".
Waiting for your authorization...
Successfully authorized.
Uploading...
複製程式碼
當然了,一般情況下,你現在就是各種報錯了,如果這麼簡單就可以成功的話,那我就不會寫這篇文章了。莫慌,接著往下看。
3、釋出過程中常見錯誤
- 去掉host檔案中針對
PUB_HOSTED_URL
、FLUTTER_STORAGE_BASE_URL
的修改。
如果你看到下圖第一行所示的這個錯誤,此時你需要去掉官方指引裡面對PUB_HOSTED_URL
、FLUTTER_STORAGE_BASE_URL
的修改,這些修改會導致上傳pub失敗。github.com/flutter/flu…
修改後的host如下:然後重新整理終端。
# flutter
#export PUB_HOSTED_URL=https://pub.flutter-io.cn
#export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PWD=/Users/tinytongtong/Documents/workspace/flutter/sdk/flutter/bin
export PATH="${PWD}:${PATH}"
複製程式碼
- 未開代理
一般情況下,如果你沒有
自備ladder
的話,就會看到上傳步驟卡在這兒不同了。如下所示。
tinytongtongdeMacBook-Pro% flutter packages pub publish
Publishing flutter_lifecycle_state 0.0.1 to https://pub.flutter-io.cn:
...
Looks great! Are you ready to upload your package (y/n)? y
Uploading...
複製程式碼
你此時敲擊下Enter鍵,就會出現如下錯誤提示:
Looks great! Are you ready to upload your package (y/n)? y
Uploading...
Unhandled exception:
SocketException: Write failed (OS Error: Broken pipe, errno = 32), port = 0
#0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29)
#1 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#3 _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#4 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)
tinytongtongdeMacBook-Pro%
複製程式碼
這個錯誤根源是沒有開代理。
- 開了
lantern
代理。
如果你已經開了代理,比方說lantern,你可能就會看到如下錯誤:
bogon% flutter packages pub publish
Publishing flutter_lifecycle_state 0.0.1 to https://pub.dartlang.org:
...
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=xx1urbcvsq39xxe=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email
Then click "Allow access".
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 = 58913
pub finished with exit code 69
bogon%
複製程式碼
或者下面這種:
Waiting for your authorization...
Authorization received, processing...
Connection closed before full header was received
pub finished with exit code 69
複製程式碼
這兩個錯誤產生的根源是,你需要給終端設定代理
,也就是命令列代理
。
4、最終解決方式——命令列翻牆工具
更新:使用lantern給終端設定代理請移步mac中使用lantern給終端設定代理.
這裡推薦一種解決方式:mac端可使用proxifier + ss
的方式。
Proxifier+Shadowshocks系統全域性代理的正確姿勢
按照教程下載配置即可。
命令列代理成功校驗方式:
以 mac 為例 你輸入curl google.com
,如果有成功的迴文(一個 html 格式的文字資訊)說明成功了,如果沒有就說明你的終端還在牆內,你需要自行保證 curl 能連線成功
下面這個是我在專案根目錄下執行curl google.com
的結果,說明成功了
tinytongtongdeMacBook-Pro% curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
tinytongtongdeMacBook-Pro%
複製程式碼
5、一次成功上傳的示例
在所有的問題都解決之後,再次flutter packages pub publish
命令,輸出如下:
tinytongtongdeMacBook-Pro% flutter packages pub publish
Publishing flutter_lifecycle_state 0.0.2 to https://pub.dartlang.org:
|-- .gitignore
|-- .idea
| |-- codeStyles
| | '-- Project.xml
| |-- dbnavigator.xml
| |-- encodings.xml
| |-- libraries
| | |-- Dart_Packages.xml
| | |-- Dart_SDK.xml
| | '-- Flutter_Plugins.xml
| |-- markdown-navigator
| | '-- profiles_settings.xml
| |-- markdown-navigator.xml
| |-- misc.xml
| |-- modules.xml
| |-- vcs.xml
| '-- workspace.xml
|-- .metadata
|-- CHANGELOG.md
|-- LICENSE
|-- README.md
|-- android
| |-- app
| | '-- src
| | '-- main
| | '-- java
| | '-- io
| | '-- flutter
| | '-- plugins
| | '-- GeneratedPluginRegistrant.java
| '-- local.properties
|-- lib
| '-- flutter_lifecycle_state.dart
|-- pubspec.yaml
'-- test
'-- flutter_lifecycle_state_test.dart
Looks great! Are you ready to upload your package (y/n)? y
Uploading...
Successfully uploaded package.
tinytongtongdeMacBook-Pro%
複製程式碼
釋出成功後,你的gmail就會收到通知郵件了,郵件中有你專案的連結,如下所示:
參考
Failed to upload the package #16658