Wails开发桌面GUI
开发wails的时候尽可能把它想象成开发vue的场景go install github.com/wailsapp/wails/v2/cmd/wails@latest
安装
wails init -n myapp -t vue
创建一个vue的项目cd myapp
进入这个myapp
.项目初始结构
├── build //项目构建目录
│ ├── appicon.png //应用程序图标
│ ├── darwin/ //Mac 特定的项目文件
│ └── windows/ //特定于 Windows 的项目文件
├── frontend/ //前端项目文件
├── go.mod /模块文件
├── go.sum Go 模块校验和文件
├── main.go //主应用程序
└── wails.json //项目配置
wails dev
运行wails build
编译
编译后可执行文件会在build/bin
目录中
main.go的初始内容像这样:
package main
import (
"embed"
"github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
)
//go:embed all:frontend/dist
var assets embed.FS
func main() {
// 创建一个新的app
app := NewApp()
// 以参数启动
err := wails.Run(&options.App{
Title: "这是一个测试程序",
Width: 1024,
Height: 768,
// 服务器
AssetServer: &assetserver.Options{
Assets: assets,
},
BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
OnStartup: app.startup, // 启动时运行
// OnShutdown: app.shutdown, // 关闭时运行
Bind: []interface{}{
app, // 绑定app
},
})
if err != nil {
println("Error:", err.Error())
}
}
而需要运行的程序它写在app.go:
// 这个页面定义了App结构体,联通前后端的方法,这里定义了一个App结构体
//所有包含func (a *App) 都属于App结构体方法,它在main.go中被绑定到前端
package main
import (
"context" // 上下文
"fmt"
)
// APP结构体,上下文管理
type App struct {
ctx context.Context
}
// 创建一个新实列APP返回APP结构体指针
func NewApp() *App {
return &App{}
}
// 启动时运行,这是绑定到APP结构体生命周期的方法,它在main.go中被绑定到前端
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
fmt.Println("程序启动")
}
// // 关闭时运行
// func (a *App) shutdown(ctx context.Context) {
// a.ctx = ctx
// fmt.Println("程序关闭")
// }
// 这是一个前端可以调用的方法
func (a *App) Greet(name string) string {
return fmt.Sprintf("你输入了 %s, 这是go生成", name)
}
在前端调用后端Greet方法
<script setup>
//导入后端方法
import {Greet} from '../../wailsjs/go/main/App'
function greet() {
Greet(data.name).then(result => {
data.resultText = result
})
}
</script>
修改图标
项目根目录\build\appicon.png
尺寸:1024*1024
删除icon.ico重新运行后会生成新的ico项目根目录\build\windows\icon.ico