Intro

年前写了个脚本给别人实现自动化操作,最开始同事写用 JavaScript 实现,考虑时间紧迫就发给别人用了,但由于距离较远而且设备不固定,如何指挥没有经验的人安装 node 环境逐渐成了个问题,然后我就用 go 重构了脚本。

重构就是照着 js 写一遍,很快啊啪的一下交叉编译完成没啥问题

#!/bin/bash
GOOS=windows GOARCH=amd64 go build -o extract-tel.exe *.go

TimezoneData

几天后同事提了新需求:要选择日期;那简单啊给个 input 让他们给时间戳输进去不就得了

加了两个fmt.Scanln()分别输入月份和日期(年份默认今年),然后我加上转时间就好了嘛

month, day := 0, 0
fmt.Println("**需要输入报备的订单日期**")
fmt.Println("输入月份:")
_, err := fmt.Scanln(&month)
if err != nil {
return
}
fmt.Println("输入天数:")
_, err = fmt.Scanln(&day)
if err != nil {
return
}
// 根据输入转成 time.Time
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println("获取时区出错")
return
}
time := time.Date(2022, time.Month(month), day, 0, 0, 0, 0, location)

然后交叉编译到放到 windows 一测,很棒,直接崩了看了下打出来 获取时区出错 看来是没拿到失去数据,想办法给时区数据打包进去。

  1. 编译时加选项 -tags timetzdata
GOOS=windows GOARCH=amd64 go build -tags timetzdata -o delay-reportor.exe  *.go
  1. 引入包会自动打包 _ "time/tzdata"
import (
"fmt"
"os"
"time"
_ "time/tzdata"
)

然后就可以正常运行了

GUI

在命令行输入对大多数人来说还不是很友好,打算写个界面用一下,并且有了界面就可以选择目录执行(考虑命令行输入目录不方便写死了当前目录,所以每次执行要给它拖到新的文件夹)。

那该用什么来写好呢?

Electron

使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序

第一个想到的就是它,因为最开始就是用 node 实现的功能,要的技术都熟悉估计看看文档就可以了,但觉得为了实现这个小功能用上 Chromium 内核有点过于沉重了。

Wails

使用 Go + HTML + CSS + JS 构建桌面应用

image.png

想起之前见到过 Fyne 的界面不是很好看(矫情),看到 wails 的时候两眼放光,支持任何前端,用 vue 写个界面还不简单。刚升级了 2 版本支持 Mac 和 Windows,还是中文文档,但下载下来之后准备初始化就来问题了。

Vue3 成了默认版本,采用 Vite 管理, Esbable 打包,花了两天熟悉之后写了个 demo 出来,成功在 js 里调用 go之后我陷入了沉思……我提莫为什么不直接在 js 里写了啊?有系统级的操作得用 go 调用。但主要问题是这个前端虽然没有用 Chromium,但他是 webkit 啊,还是引入了个浏览器内核,要是用它来写还不如直接上 Electron,多少有点别扭。

Fyne

The Fyne toolkit is an easy to learn, free and open source, platform for building graphical applications for desktop, mobile and beyond. Combining the power and simplicity of the Go programming language with a carefully crafted library of widgets it is now easier than ever before to build your application and deploy it across all platforms and stores.

image.png

因为 Fyne 官网简介这么多字其他就一行就它了

最终选择用 Fyne 实现,好处是都用 go,不需要引入浏览器内核编译后不会太大,看文档支持交叉编译(使用人都是 Windows),所以感觉很友好又是小功能,好用就行,这不比命令行好看。

结果就是Electron没有尝试,Wails 浅尝辄止, Fyne 踩坑之旅开始……