Flutter组件私有仓库搭建

1,434 阅读2分钟

有些私有的软件包发布在公网上并不是很好的选择,因为里面可能涉及到公共的业务等。所以大点的技术团队都会搭建内部的组件库,例如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;

image​ ​image​ ​image

如果服务器没有办法访问google,需要替换一下上游的仓库,因为在私有库拉不到的包会去上有仓库拉取,在上述的app.dart文件中搜索 this.upstream = 将后面的 pub.dev 替换为 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 时就使用的是私有仓库了

参考链接