flutter packages 開發實戰——釋出失敗問題解決

tinyvampirepudge發表於2019-07-10

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填入我們的專案名稱即可,其他資訊按需填寫。

具體如下圖。

flutter packages 開發實戰——釋出失敗問題解決

flutter packages 開發實戰——釋出失敗問題解決

flutter packages 開發實戰——釋出失敗問題解決

具體業務開發

接下來就可以在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_URLFLUTTER_STORAGE_BASE_URL的修改。

如果你看到下圖第一行所示的這個錯誤,此時你需要去掉官方指引裡面對PUB_HOSTED_URLFLUTTER_STORAGE_BASE_URL的修改,這些修改會導致上傳pub失敗。github.com/flutter/flu…

flutter packages 開發實戰——釋出失敗問題解決

修改後的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系統全域性代理的正確姿勢

ss X

按照教程下載配置即可。

命令列代理成功校驗方式:

以 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就會收到通知郵件了,郵件中有你專案的連結,如下所示:

flutter packages 開發實戰——釋出失敗問題解決

參考

Flutter學習指南:封裝 API 外掛——玉剛說

flutter pub 釋出失敗

Failed to upload the package #16658

Publish plugin in china #17070

zhuanlan.zhihu.com/p/60136574

相關文章