Flutter Pub私有仓库搭建

在Flutter开发的过程中也会遇到三方库管理的问题,有些三方库需要进行再定制,我们会fork一份下来进行维护,此外也有一些私有组件不适合上传到公有仓库,于是就有了自己搭建私有pub库的需求。这篇文章主要介绍如何搭建私有化pub仓库,及在搭建私有pub仓库过程中的探索。首先进行准备工作,创建一个package,之后用它来进行上传到公有仓库和私有仓库,在这个过程中会介绍怎么创建公有仓库和私有仓库。

1.准备package

首先介绍一下pub仓库,pub仓库里存放的是开发者提交的Package,Package包含以下两种类别:

• 纯 Dart 库:用 Dart 编写的传统 package,比如 path。其中一些可能包含 Flutter 的特定功能,因此依赖于 Flutter 框架,其使用范围仅限于 Flutter,比如 fluro。

• 原生插件:使用 Dart 编写的,按需使用 Java 或 Kotlin、ObjC 或 Swift 分别在 Android 和/或 iOS 平台实现的 package。一个具体的例子是 battery。

详情可以参考Flutter Packages 的开发和提交,里面对于package的介绍。

想要提交自己的package,那么咱们就先创建一个吧。

// 创建纯dart插件 package
flutter create --template=package hello

// 创建原生插件 package
flutter create --org com.example --template=plugin hello

r咱们就以复杂的为例,创建一个包含原生插件的package,在终端输入以上指令,或者可以直接通过Android Studio来创建。

newpackage.png

创建好之后,一个最简单的package就生成了,如果上传到pub仓库的话,就可以让其他开发者轻松使用啦。

package的目录如下,我创建了一个叫做dh_plugin的package,作为下面操作的例子:

packagefile.png

提交之前,请确保 pubspec.yamlREADME.md 以及 CHANGELOG.md 文件已被审查,以保证其内容的完整性和正确性。

其中最主要的是pubspec.yaml的编写,参考Pubspec 文件,当然其中的设置不会全用,一个最简单的pubspec.yaml只需要包含以下几项即可:

name: dh_plugin
description: plugin test
version: 0.0.1
author: 作者 <邮箱> (或者 authors: )
environment:
 sdk: ">=2.1.0 <3.0.0"
homepage: 介绍当前package地址

可以通过dry-run命令以检验是否所有内容都通过了分析:

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.

其中出现一两处warning也可以,只要没有error即可。
到此package的准备工作就做好了,接下来就可以准备上传了。

2.公有仓库

介绍搭建私有仓库之前,咱们先看下公有仓库如何搭建,其发布流程差不多,主要差异在于仓库的搭建,当然如果不关心公有库的话也可以略过这部分不看。

通过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...

如果环境搭建好的情况下,到这里上传公有package的流程就到此结束了。
不过你可能会有疑问package上传到哪里了呐?
这就和上面长长的一串authorization 地址有关联了,从 https:// 开始拷贝直到userinfo.email结束,复制到浏览器中去。浏览器会根据链接带着的信息进行解析,选择你的google账号进行登录,之后就会看到

Pub Authorized Successfully
The pub client has been successfully authorized. You may now use it to upload packages and perform other tasks.

终端的进度也会变成,开始上传啦

Waiting for your authorization...
Authorization received, processing...

等等,前面提到输入google账号...
是的,还需要创建一个a verified publisher账号,发布 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.

一般的开发者可能会卡在第4步,需要域名认证。
在pub.dev登录之后,点击自己的头像 creat publisher,出现如下界面

publisher.png

输入域名,之后按照提示进行验证

auth.png

选择自己的验证方式,我选择是dns验证,将txt记录添加到dns解析中。

dns.png

创建好了之后可以在pub.dev进行管理packages也可以进行组员管理。
有没有觉得好麻烦,publisher创建终于告一段落。
刚才上传怎么样了呐?失败了...

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$ 

虽然浏览器通过各种手段翻·墙成功,但是终端还不能翻·墙,可以在终端ping google.com试试通不通,配置终端翻·墙在这里阻塞了半天,google 搜索终端翻·墙的前10个方法都试了一遍还是没有配置好,如果你知道欢迎交流一下。

这是由于浏览器是通过传输层(第四层)ssr的socks代理,终端ping走的是网络层(第三层)协议问题解释。
好吧,可能到这里就要放弃了吧。
先别走,看看私有仓库怎么创建吧,不用经过认证,秒上传。

3.私有仓库

如果你搭建好了私有仓库,上传私有package和公有package流程差别不大。只是在pubspec.yaml多了一个字段publish_to标识私有仓库地址。
完整的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: 介绍当前package地址

publish_to官方介绍

首先我们需要搭建私有服务器,官方demo在此pub_server
按照pub_server的介绍搭建本地服务之后,就可以将package上传私有仓库啦,保持私有主机pub_server运行不要关机。

pubserver.png

注意这个默认地址是本地地址,如果想其他人也可以进行访问的话,需要将这个地址进行修改。
修改方式如下图,将localhost改为私有库所在主机的ip地址即可。
修改pub_server源码:

host.png

在启动pub_server之后就可以发布啦,

server.png

发布指令为

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

不出意外还是出错,这是因为私有仓库也是需要经过publisher验证,被墙害苦了,那么自己的私有仓库能够不进行publisher验证吗?答案是可以的。

Flutter是完全开源的,那咱们首先看看pub工具怎么实现的,找到/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执行的其实是个pub.dart.snapshot文件,pub的源码github也有,把里面的官方验证去掉不就可以了吗?

pub.png

这里感谢ameryzhu的文章指明了关键点替换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可以看这里,可以使用这个指令:

dart --snapshot= 
例子:
dart --snapshot=mypub.dart.snapshot /Users/whqfor/Desktop/Pub/pub-master/bin/pub.dart 

生成的 mypub.dart.snapshot默认在当前目录/Users/whqfor/下。将mypub.dart.snapshot放置到和pub.dart.snapshot同目录。
到此构建pub私有库的流程结束啦。
再来发布一次

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.

秒传有没有。
那么怎么使用私有库呐?dependencies

dependencies:
 transmogrify:
 hosted:
 name: transmogrify
 url: http://some-package-server.com
 version: ^1.0.0

在本demo中对应的即是

dh_plugin:
 hosted:
 name: dh_plugin
 url: http://10.29.XX.XXX:8080
 version: 0.0.4

注意事项:更细package时,版本号变化,记得也更新CHANGELOG.md

例如:

## 0.0.1
* TODO: Describe initial release.

## 0.0.2
* 更换pub_server ip地址

## 0.0.3
* 修改一点内容验证是否成功

好啦,感谢看到这里,如有疑问欢迎与我交流。

几个问题:

1.更改默认snapshot影响公有package使用吗?
经过自测不影响

2.pub源码怎么同步
这个问题没有太好的答案,定期merge官网更新吧,可以参考咸鱼的方案,还在研究。

3.自己的package发布到那里了呐?
在隐目录/Users/whqfor/.pub-cache/hosted/中带ip地址和8080端口的文件中。

你可能感兴趣的:(Flutter Pub私有仓库搭建)