Go+Wails学习笔记(一)环境搭建与配置

前言

Go,又称Golang,是谷歌在21世纪开发的一种新的编程语言,它静态强类型、从语言层面支持并发(Goroutine)、支持垃圾回收GC。

Go语言有一些笔者很喜欢的特点,譬如跨平台、交叉编译(在某个环境中编译其他平台的程序)、支持并发、语言上做“减法”精简关键字、直接静态编译成单个二进制可执行文件(告别缺少vcruntime.dll的痛苦)。

Go语言像是C++和python的融合,存在着Go语言开发者的一些“固执”,比如花括号{}的换行,也有一些缺陷。Go适合写服务器的后端应用,但是用来写带有GUI的应用程序还不是那么成熟,官方原生不支持,故有许多相关GUI库,如:Qt、ui、walk、gio、go-flutter-desktp。经过若干比较之后笔者认为使用Go+wails的方式是大势所趋。

Wails的思路是使用Web端的技术(html/css/js)作为前端,可以使用js框架如vue和react,后端使用Go语言,前后端交互通过go与js绑定某种方法实现,如此前端便可使用各种成熟的框架,似乎学习web端的技术、Go语言、另一个网页后端的Go语言框架(如Gin)即可打通全栈,想法是好,但是还得一步步学习。

Wails 和 electron 不同,electron是把chromium浏览器内核打包,包括ffmpeg.dll等,体积上非常臃肿,首次启动慢,所占存储空间和内存都偏大,和笔者体积较小、功能齐全的理念相悖。wails则是直接调用系统自带浏览器内核,至于内存...有待验证。

经过测试,wails的hello-world.exe体积10.2MB、zip压缩包4.3MB、7z压缩3.5MB、UPX压缩后3.93MB,内存占用43.7MB。

接下来笔者会把整个学习的过程记录下来,目前只有wails的官网可以提供较好的文档,其中也会涉及纯Golang的知识点,因为笔者也在Go语言学习初期。

环境搭建

官方文档:https://wails.app/gettingstarted/

折腾了很久,最后决定在虚拟机中使用Win10企业版LTS搭建Go+wails的环境,装MacOS出现了兼容问题,linux中也有一些难处、需要大量的时间深入了解linux,故当下选择win10。

有钱了也组台黑苹果吧,windows最大的问题是它不够优雅。

安装Go

下载对应安装包并安装。下载地址

安装Node

下载安装,如此便有了npm。下载地址

再用如下命令安装cnpm,国内使用的速度提升很大。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n19" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">npm install -g cnpm --registry=https://registry.npm.taobao.org</pre>

如有其它web端的依赖请自行安装。

安装GCC库

Windows下需要安装GCC库用来编译。下载地址

安装Git Bash

可能会用到Git操作Push/Clone,建议安装。下载地址

安装Docker

官方文档似乎提到Docker在wails交叉编译时会用到。下载地址

安装IDE

这里推荐两个IDE/编辑器:微软的VSCode 和 jetbrains的Goland。

各有优劣,这里笔者用的是Goland,学生使用教育邮箱可白嫖,开源项目也可申请。

VSCode:https://code.visualstudio.com/

Goland:https://www.jetbrains.com/go/

IDE的配置略过,注意VSCode可以安装sync插件,把所有配置同步到github gist上,之后到任意机器上安装sync插件粘贴一串代码、登录github即可同步所有插件设置。

设置Goproxy

按照Goproxy官网的说明设置代理:

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n68" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct</pre>

其他(非必须)

笔者做了一些美化工作,包括安装 Mactype、安装Sarasa字体和Firacode字体、使用NoMeiryoUI更改全局字体为10pt Sarasa SC,使用百分浏览器并关闭DW,这样字体终于能看了。

Go语言项目文件结构

GOPATH下共有三个文件夹:bin、pkg、src

  • bin存放编译好的程序

  • pkg存放编译后生成的各种文件和各种包(代码中import的外部包)

  • src存放源代码

一般需要配置GOROOT、GOPATH、GOBIN的环境变量,不过用Goland似乎可以懒一点,因为是虚拟机所以全默认很方便,src文件夹直接发送到桌面快捷方式。

测试纯Go语言

可以用Goland创建一个项目,比如命名为test,即新建src/test/main.go,输入以下内容:

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n47" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">package main

import(
"fmt"
)

func main() {
fmt.Println("Hello World!")
}</pre>

在终端,位置src/test/处使用命令go run main.go,编译和运行第一个Go程序。

使用命令go build main.go编译得到可执行程序,运行main.exe,结果如下:

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n50" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">C:\Users\Purp1e\go\src\test>main.exe
That's Good!</pre>

运行第一个Wails程序

在终端中输入wails,配置一下名字和邮箱。

image

然后cd到src文件夹,使用wails init,有的选项可直接使用ENTER大法xd。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n55" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">C:\Users\Purp1e\go\src>wails init
Wails v1.7.1 - Initialising project

The name of the project (My Project): tutorial
Project Name: tutorial
The output binary name (tutorial):
Output binary Name: tutorial
Project directory name (tutorial): tutorial
Project Directory: tutorial
Please select a template:
1: Angular - Angular 8 template (Requires node 10.8+)
2: React JS - Create React App v3 template
3: Vanilla - A Vanilla HTML/JS template
4: Vue2/Webpack Basic - A basic Vue2/WebPack4 template
5: Vuetify1.5/Webpack Basic - A basic Vuetify1.5/Webpack4 template
6: Vuetify2/Webpack Basic - A basic Vuetify2/Webpack4 template
Please choose an option [1]: 4
Template: Vue2/Webpack Basic

Generating project...
Building project (this may take a while)...
Project 'tutorial' built in directory 'tutorial'!</pre>

项目结构如下图:

image

其中frontend是前端的文件夹,main.go中做了前后端的绑定,appicon.png是程序的图标。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n59" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">C:\Users\Purp1e\go\src\tutorial>wails -help


| | / /___ () /____
| | /| / / __ `/ / / /
| |/ |/ / /
/ / / (
) v1.7.1
|/|/_,///____/ https://wails.app
The lightweight framework for web-like apps

Available commands:

setup Setup the Wails environment [default]
migrate Migrate projects to latest Wails release
init Initialises a new Wails project
build Builds your Wails project
serve Run your Wails project in bridge mode
update Update to newer [pre]releases or specific versions
issue Generates an issue in Github

Flags:

-help
Get help on the 'wails' command.
​</pre>

其中wails build是构建项目并生成到build文件夹里,wails serve则是把项目运行在localhost中,可以热调试。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n61" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">C:\Users\Purp1e\go\src\tutorial>wails build
Wails v1.7.1 - Building Application

Skipped frontend dependencies (-f to force rebuild)
Building frontend...
Ensuring Dependencies are up to date...
Packing + Compiling project...
Awesome! Project 'tutorial' built!

C:\Users\Purp1e\go\src\tutorial>cd build

C:\Users\Purp1e\go\src\tutorial\build>tutorial.exe</pre>

运行结果如图:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342