使用Golang跨平台GUI框架进行桌面应用程序开发

跨平台桌面应用程序开发框架非常多,之前提到的electron框架是属于NodeJS系列的,wxformbuilde是Python系列的,以及Java的swing/swt,等。本篇记录使用golang来进行跨平台的桌面应用程序开发。
当然这并不是重复鸡肋的轮子,相对electron、wxformbuilde、Java这类跨平台框架,golang的优势很明显:

  • 超高的执行效率
  • 超小的程序打包体积
  • 静态编译,脱离runtime 这几个优势是除了c/c++应用外其他大部分跨平台桌面应用所不能比拟的,而golang有着比c/c++更高的开发效率,所以这也是本篇的初衷。

mac win7 Linux 文件大小

使用govendor进行包管理

golang官方并没有提供类似于npm的依赖管理方案,vendor目录是golang在1.5版本引入的设计,用来支持本地依赖包的管理,因为混编打包需要使用docker来进行,而打包环境镜像中是不支持全局依赖的,为了能进行vendor本地依赖,这里选择使用govendor进行包管理。

安装govendor

使用go get命名进行安装。

go get -u github.com/kardianos/govendor

要保证$GOPATH/bin路径是在系统的PATH环境变量中,否则安装的govendor命令系统会找不到。

使用govendor初始化工程

将项目工程移动到$GOPATH/src目录下,或直接在$GOPATH/src目录下新建工程。

使用govendor安装依赖

使用命令govendor add将依赖加入工程目录的vendor文件夹下,这里加入GUI框架:

govendor add github.com/andlabs/ui

编写HelloWorld

在工程目录下新增文件demo.go,编写一个简单的helloworld界面:

package main

import (
	"github.com/andlabs/ui"
)

func main() {
	err := ui.Main(func() {
		input := ui.NewEntry()
		button := ui.NewButton("Greet")
		greeting := ui.NewLabel("")
		box := ui.NewVerticalBox()
		box.Append(ui.NewLabel("Enter your name:"), false)
		box.Append(input, false)
		box.Append(button, false)
		box.Append(greeting, false)
		window := ui.NewWindow("Hello", 200, 100, false)
		window.SetMargined(true)
		window.SetChild(box)
		button.OnClicked(func(*ui.Button) {
			greeting.SetText("Hello, " + input.Text() + "!")
		})
		window.OnClosing(func(*ui.Window) bool {
			ui.Quit()
			return true
		})
		window.Show()
	})
	if err != nil {
		panic(err)
	}
}

在命令行执行命令go run demo.go,就能看到这个开篇的那个小界面了。 本篇着重记录开发流程,关于GUI框架的详细使用方法,详见github

本地打包

使用go的打包命令可以直接打包出当前环境下的release包:

go build demo.go

执行命令行会生成对应环境下的可执行文件’demo’。

使用docker混编环境进行三个平台同时打包

上面提到go的打包命令能够打出当前平台的可执行文件,那么如果要多平台发布呢?总不能再找另外两台不同操作系统来进行打包吧。当然golang是存在多平台打包命令的,但是我们使用到的gui框架对特定平台有特定的需求,所以golang的多平台打包命令并不能满足需求。
这时候神器docker就可以出场了,gui框架提供了一个混编的docker镜像,这个docker镜像中存在已经配置好的各种依赖环境,满足三个平台的编译条件。
这就意味着,我们可以通过跨平台的docker通过镜像模拟出同样的编译环境,而达到同时针对三个平台目打包的目的,非常赞。

安装docker

docker的安装教程之前的文章有写到,这里不再赘述。

拉取镜像

混编环境的镜像有3.4GB大小,我这边选择在服务器上拉取镜像并在服务器上进行打包。当然你也可以选择在本地进行,前提是你本地网速够快,硬盘够大。

这一步是可选操作,因为我这边的操作是选择在服务器上进行的,或许会面临ssh链接断开造成镜像拉取失败的问题,所以上神器tmux:

tmux new -s dockerpull

使用tmux创建会话后,在会话中用docker命令拉取镜像:

docker pull magj/go-ui-crossbuild

这个过程需要较长时间的等待。

打包

镜像拉取完成后,就可以进行打包了。 如果是在服务器上进行的,需要将项目工程上传到服务器上。
使用docker镜像中的打包命令进行打包:

docker run --rm -v /yourpath/vendordemo:/go/src/vendordemo magj/go-ui-crossbuild gouicrossbuild vendordemo demo.go ./

这个命令是让docker用镜像创建了一个容器,并使用容器中的gouicrossbuild命令进行操作,完成后退出并销毁容器。下面是相关参数的含义:
--rm:容器退出后将其删除
-v:映射工程路径到docker容器工程路径下
gouicrossbuild:指定三个参数,工程名称 模块名称 打包输出地址

不出意外的情况下,在工程目录下,可以得到demo_darwin.app、demo_linux、demo_windows.exe三个可执行文件,分别对应Mac、Linux、Windows三个系统。

完工。

文章目录
,