基于unpub的Flutter私有组件库搭建
有些私有的软件包发布在公网上并不是很好的选择,因为里面可能涉及到公共的业务等。所以大点的技术团队都会搭建内部的组件库,例如nodejs、docker等,flutter也不例外。本文将基于unpub来讲述一下搭建flutter私有仓库以及如何使用它发布私有包。
一、服务器端安装
1、安装flutter/dart环境
一般是linux服务器,参照官网文档即可。
2、配置环境变量
想知道自己目前使用shell是哪个,可以使用下面的命令查看:
echo $SHELL
如果输出了/bin/zsh就是zsh,输出了/bin/bash就是bash,其他的找对应配置文件即可。下面写入flutter的环境变量,配置FLUTTER_ROOT指向flutter的安装目录:
# zsh 修改
echo "export FLUTTER_ROOT=<your flutter installation dir>" >> ~/.zshrc
echo "export PATH=$FLUTTER_ROOT/bin:$PATH" >> ~/.zshrc
# 立即生效
source ~/.zshrc
# bash 修改
echo "export FLUTTER_ROOT=<your flutter installation dir>" >> ~/.bashrc
echo "export PATH=$FLUTTER_ROOT/bin:$PATH" >> ~/.bashrc
# 立即生效
source ~/.bashrc
如果当前网络不能访问谷歌,建议配置国内的镜像地址加速后续的访问,还需要配置下面的环境变量:
# zsh 修改
echo "export PUB_HOSTED_URL=https://pub.flutter-io.cn" >> ~/.zshrc
echo "export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn" >> ~/.zshrc
# 立即生效
source ~/.zshrc
# bash 修改
echo "export PUB_HOSTED_URL=https://pub.flutter-io.cn" >> ~/.bashrc
echo "export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn" >> ~/.bashrc
# 立即生效
source ~/.bashrc
3、安装mongodb
如果没有安装过mongodb,这里推荐使用docker安装,方便后续的迁移和备份。下面是docker-compose.yml文件,注意不要将mongodb暴露到外网。需要将数据文件映射到本地磁盘,方便后期的迁移。
version: '2'
services:
dart-mongo:
image: mongo:4.4.18
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: dart_mongo
MONGO_INITDB_ROOT_PASSWORD: dart_mongo_pass
MONGO_INITDB_DATABASE: dart_pub
ports:
-"127.0.0.1:27019:27017"
volumes:
-./dbdata:/data/db
4、全局安装unpub
flutter pub global activate unpub
5、删除谷歌鉴权
找到安装的unpub包,注意下面加粗的文本:pub.dartlang.org,这个是镜像的地址,如果在第4步修改了镜像地址,那这里可能是pub.flutter-io.cn,后面的版本号也不一定是2.1.0,可能会是新一点的版本,根据当时的版本查看即可。
使用vscode打开$FLUTTER_ROOT/.pub-cache/hosted/pub.dartlang.org/unpub-2.1.0
修改lib/src/app.dart文件,搜索_getUploaderEmail;
删除用户上传的邮箱信息。
如果服务器没有办法访问google,需要替换一下上游的仓库,因为在私有库拉不到的包会去上有仓库拉取,在上述的app.dart文件中搜索 this.upstream =
将后面的 https://pub.dev 替换为 https://pub.flutter-io.cn 即可。
6、重新activate一下unpub包
flutter pub global deactivate unpub
flutter pub global activate unpub
7、启动服务器
下面-p是指定端口号码,–database是指定mongo链接,直接启动就可以了。
启动之后就可以使用 http://ip:8080 访问了。
# 配置正确的链接
flutter pub global run 'unpub:unpub' -p 8080 --database 'mongodb://dart_mongo:dart_mongo_pass@127.0.0.1:27019/dart_pub?authSource=admin'
8、(可选)配置域名
这一步不是必须步骤,直接使用IP加端口也能实现。使用nginx代理到该服务器上后绑定域名,注意下面使用了强制的https(如果没有证书可以不使用https),下面配置的域名需要修改为你自己的域名。
server {
listen 80 ;
server_name flutter-pub.xxx.com;
# 强制rewrite
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl http2;
server_name flutter-pub.xxx.com;
# 存储日志的位置
access_log /var/log/nginx/unpub.log;
error_log /var/log/nginx/unpub_error.log;
# 证书位置,如果是在nginx.conf同级目录,可以用相对路径,例如该配置就在nginx.conf同级的ssl目录
ssl_certificate ssl/xxx.crt;
ssl_certificate_key ssl/xxx.key;
gzip on;
location / {
# 这里的端口号要和启动的时候保持一致
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Workaround for:
# Asynchronous error HttpException:
# Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers
proxy_http_version 1.1;
}
}
二、客户端配置
服务器搭建完成之后,如何在客户端才能使用我们自己搭建的私有flutter仓库呢,下面简单说一下。
客户端也需要安装Flutter和配置FLUTTER_ROOT环境变量,可以参照安装文档。
1、跳过谷歌鉴权
因为flutter是谷歌出的,发布组件的时候默认需要谷歌鉴权,私有的仓库就需要跳过谷歌鉴权,具体如下。⚠️注意:如果你不需要发布组件,这一步直接跳过即可。
git clone https://github.com/ameryzhu/pub.git
cd pub
# 安装以来
flutter pub get
# 生成快照
dart --snapshot=pub.dart.snapshot bin/pub.dart
# 复制到flutter中
cp pub.dart.snapshot $FLUTTER_ROOT/bin/cache/dart-sdk/bin/snapshots/
cp pub.dart.snapshot $FLUTTER_ROOT/bin/cache/
2、发布包到私有的仓库
修改包的pubspec.yaml文件,添加推送仓库配置
name: flutter_ui
description: A new Flutter package project.
version: 0.0.1
publish_to: https://flutter-pub.xxx.com/
# ......
3、配置拉取组件的仓库
就想nodejs一样,nrm包可以切换不同的远程仓库配置,目前flutter没有对应的工具,所以需要手动配置,其实也是配置对应的环境变量,配置好重启终端生效。
需要修改的文件会随着你使用的shell不一样,如果不知道自己当前的shell是什么,可以通过下面的命令查看:
echo $SHELL
如果输出了/bin/zsh就是zsh,输出了/bin/bash就是bash,其他的找对应配置文件即可。
# zsh 修改
echo "export PUB_HOSTED_URL=https://flutter-pub.xxx.com" >> ~/.zshrc
# 立即生效
source ~/.zshrc
# bash 修改
echo "export PUB_HOSTED_URL=https://flutter-pub.xxx.com" >> ~/.bashrc
# 立即生效
source ~/.bashrc
后续使用flutter pub get 时就使用的是私有仓库了