前言

在 Flutter 开发中,考虑到我们不同业务组件下依赖不同版本的基础组件,如果采用分支依赖管理特别不方便,因此搭建私有 pub 包服务很有搭建必要。在技术调研后发现 pub 官方开源的的 pub server 已有两年多没有更新,且现在已调整为只读。因此使用基于字节开源的 unpub 开源搭建私有仓库平台。

unpub 私有平台搭建

安装 MongoDB

官方安装方式 传送门

选择 On-premises MongoDB locally 下载

images

.zshrc 添加环境变量

# 写入环境变量
export PATH=/Users/zhengzeqin/flutter/bin:$PATH
# 写入环境变量
export PATH="/usr/local/opt/mongodb-community@4.4/bin:$PATH

homebrew 安装

brew tap mongodb/brew
# 4.4 版本号
brew install mongodb-community@4.4
# 启动服务
brew services start mongodb-community@4.4
# 查看已启动服务
brew services list

images

Docker 安装 传送门

unpub 传送门

.zshrc 添加环境变量

export PATH="$PATH":"$HOME/flutter/.pub-cache/bin"

安装 unpub

flutter pub global activate unpub

去掉 unpub 的 google 验证

images

  • 查找 app.dart , 修改使用 _getUploaderEmail 的地方

  • 第一处

images

  • 第二处

images

  • 第三处

images

Flutter 启动命令

flutter pub global run 'unpub:unpub' --database 'mongodb://localhost:27017/dart_pub'
# 失效
flutter pub global deactivate unpub

Dart 启动命令

dart pub global activate unpub

dart pub --trace pub global run 'unpub:unpub' --database 'mongodb://localhost:27017/dart_pub'

# 失效
dart pub global deactivate unpub

Get 点

  • 项目中存在两个 .pub-cache 注意别修改错地方
    • /Users/zhengzeqin/flutter/.pub-cache
    • /Users/zhengzeqin/.pub-cache
  • 项目 .pub-cache 下的 pub.flutter-io.cnpub.dartlang.org 文件夹, 插件源码安装与执行上述 flutter pub global activatedart pub global activate 有关系
  • 修复 flutter 缓存插件包问题
flutter channel stable 
flutter upgrade
flutter pub cache repair //To perform a clean reinstall of the packages in your system cache, use pub cache repair

mogodb 启动后执行下面命令启动

flutter pub global run 'unpub:unpub' --database 'mongodb://localhost:27017/dart_pub'

成功启动

images

私有平台

images

开机启动 shell 脚本问题

通过 shell 脚本自启动服务

通过脚本校验服务是否连接成功

#!/bin/bash

function network()
{
    #超时时间
    local timeout=120

    #目标网站
    local target=http://0.0.0.0:4000/

	echo "check ${target}"

    #获取响应状态码
    local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`

    if [ "x$ret_code" == "x200" ]; then
        #网络畅通
        return 1
    else
        #网络不畅通
        return 0
    fi

    return 0
}

while [[ true ]]; do
	echo 'connecting...'
	if network == 0
	then
		echo "unpub service start fail..."
	    flutter pub global run 'unpub:unpub' --database 'mongodb://localhost:27017/dart_pub'
	else
	    echo "unpub service start success..."
	    exit 0
	fi	
	sleep 15
done

安装遇到的问题

‘String?’ is nullable and ‘Object’ isn’t.

修改源码

images

mongodb 启动失败

端口被占用问题

# 排查占用端口
sudo lsof -iTCP -sTCP:LISTEN -n -P
# 删掉端口
sudo kill 449

images

鉴权问题

images

重新安装 mongoDB ,去掉管理员的账户密码即可

发布私有 package 到 unpub 平台

跳过谷歌验证

# 根目录执行
flutter pub get
# 继续执行
dart --snapshot=pub.dart.snapshot bin/pub.dart 
  • 生成 pub.dart.snapshot 文件

images

  • 复制之后放入 flutter/bin/cache/dart-sdk/bin/snapshots/ 目录下
  • 如果是 flutter 直接安装则放入 flutter/bin/cache 目录下

发布 Pub 私有包

📢 注意 http://192.168.x.xx:4000/ 是自己的 pub 私有包服务 ip 地址,否则会上传失败

创建 dev package 包

# 创建一个 package
flutter create --template=package zq_log
# 创建 example
flutter create example

代码推 GitLab 私仓库

images

配置 yaml 文件信息

name: zq_log
description: A flutter log tool for developing.
version: 0.0.2
homepage: https://code.addcn.com/tw591fluttermodules/zq_log
publish_to: http://192.168.x.xx:4000/

检测命令

flutter packages pub publish --dry-run

发布包到私有包管理平台

flutter packages pub publish --server=http://192.168.x.xx:4000/

发布成功

images

images

更新 yaml 信息执行 pub get

zq_log:
  version: ^0.0.1
  hosted:
    name: zq_log
    url: http://192.168.x.xx:4000/

通过 Docker 方便大家部署

为了方便大家移植部署,这边将 unpub 打包成 docker 镜像环境

安装镜像

首先拉取 GitHub 地址 代码,安装 docker 环境, 然后执行下面命令即可

# 先安装 docker 环境启动后, 在当前 docker-compose.yml 文件下执行下面命令即可
docker compose up -d 

安装运行成功如下

安装成功

images

通过 docker ps -a 命令查看运行中容器

images

參考

私有库搭建

遇到问题

Docker