7.0 KiB
Introduction
!!! note This guide is a work in progress.
Thanks for wanting to help out with development of Wails! This guide will help you get started.
Getting Started
-
Git clone this repository. Checkout the
v3-alpha
branch. -
Install the CLI:
cd v3/cmd/wails3 && go install
-
Optional: If you are wanting to use the build system to build frontend code, you will need to install npm.
Building
For simple programs, you can use the standard go build
command. It's also
possible to use go run
.
Wails also comes with a build system that can be used to build more complex
projects. It utilises the awesome Task build system. For
more information, check out the task homepage or run wails task --help
.
Project layout
The project has the following structure:
```
v3
├── cmd/wails3 // CLI
├── examples // Examples of Wails apps
├── internal // Internal packages
| ├── runtime // The Wails JS runtime
| └── templates // The supported project templates
├── pkg
| ├── application // The core Wails library
| └── events // The event definitions
| └── mac // macOS specific code used by plugins
| └── w32 // Windows specific code
├── plugins // Supported plugins
├── tasks // General tasks
└── Taskfile.yaml // Development tasks configuration
```
Development
Alpha Todo List
We are currently tracking known issues and tasks in the Alpha Todo List. If you want to help out, please check this list and follow the instructions in the Feedback page.
Adding window functionality
The preferred way to add window functionality is to add a new function to the
pkg/application/webview_window.go
file. This should implement all the
functionality required for all platforms. Any platform specific code should be
called via a webviewWindowImpl
interface method. This interface is implemented
by each of the target platforms to provide the platform specific functionality.
In some cases, this may do nothing. Once you've added the interface method,
ensure each platform implements it. A good example of this is the SetMinSize
method.
- Mac:
webview_window_darwin.go
- Windows:
webview_window_windows.go
- Linux:
webview_window_linux.go
Most, if not all, of the platform specific code should be run on the main
thread. To simplify this, there are a number of invokeSync
methods defined in
application.go
.
Updating the runtime
The runtime is located in v3/internal/runtime
. When the runtime is updated,
the following steps need to be taken:
wails3 task runtime:build
Events
Events are defined in v3/pkg/events
. When adding a new event, the following
steps need to be taken:
- Add the event to the
events.txt
file - Run
wails3 task events:generate
There are a number of types of events: platform specific application and window events + common events. The common events are useful for cross-platform event handling, but you aren't limited to the "lowest common denominator". You can use the platform specific events if you need to.
When adding a common event, ensure that the platform specific events are mapped.
An example of this is in window_webview_darwin.go
:
// Translate ShouldClose to common WindowClosing event
w.parent.On(events.Mac.WindowShouldClose, func(_ *WindowEventContext) {
w.parent.emit(events.Common.WindowClosing)
})
NOTE: We may try to automate this in the future by adding the mapping to the event definition.
Plugins
Plugins are a way to extend the functionality of your Wails application.
Creating a plugin
Plugins are standard Go structure that adhere to the following interface:
type Plugin interface {
Name() string
Init(*application.App) error
Shutdown()
CallableByJS() []string
InjectJS() string
}
The Name()
method returns the name of the plugin. This is used for logging
purposes.
The Init(*application.App) error
method is called when the plugin is loaded.
The *application.App
parameter is the application that the plugin is being
loaded into. Any errors will prevent the application from starting.
The Shutdown()
method is called when the application is shutting down.
The CallableByJS()
method returns a list of exported functions that can be
called from the frontend. These method names must exactly match the names of the
methods exported by the plugin.
The InjectJS()
method returns JavaScript that should be injected into all
windows as they are created. This is useful for adding custom JavaScript
functions that complement the plugin.
The built-in plugins can be found in the v3/plugins
directory. Check them out
for inspiration.
Tasks
The Wails CLI uses the Task build system. It is imported
as a library and used to run the tasks defined in Taskfile.yaml
. The main
interfacing with Task happens in v3/internal/commands/task.go
.
Upgrading Taskfile
To check if there's an upgrade for Taskfile, run wails3 task -version
and
check against the Task website.
To upgrade the version of Taskfile used, run:
wails3 task taskfile:upgrade
If there are incompatibilities then they should appear in the
v3/internal/commands/task.go
file.
Usually the best way to fix incompatibilities is to clone the task repo at
https://github.com/go-task/task
and look at the git history to determine what
has changed and why.
To check all changes have worked correctly, re-install the CLI and check the version again:
wails3 task cli:install
wails3 task -version
Opening a PR
Make sure that all PRs have a ticket associated with them providing context to
the change. If there is no ticket, please create one first. Ensure that all PRs
have updated the CHANGELOG.md file with the changes made. The CHANGELOG.md file
is located in the mkdocs-website/docs
directory.
Misc Tasks
Upgrading Taskfile
The Wails CLI uses the Task build system. It is imported
as a library and used to run the tasks defined in Taskfile.yaml
. The main
interfacing with Task happens in v3/internal/commands/task.go
.
To check if there's an upgrade for Taskfile, run wails3 task -version
and
check against the Task website.
To upgrade the version of Taskfile used, run:
wails3 task taskfile:upgrade
If there are incompatibilities then they should appear in the
v3/internal/commands/task.go
file.
Usually the best way to fix incompatibilities is to clone the task repo at
https://github.com/go-task/task
and look at the git history to determine what
has changed and why.
To check all changes have worked correctly, re-install the CLI and check the version again:
wails3 task cli:install
wails3 task -version