From 814e1ec059c448f45f5cf4383dc703847f61ac31 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 27 Nov 2023 20:38:42 +1100 Subject: [PATCH] [windows] initial wails dev support --- mkdocs-website/shared/alpha2.csv | 2 +- v3/cmd/wails3/main.go | 1 + v3/go.mod | 17 +++-- v3/go.sum | 34 ++++++++-- v3/internal/assetserver/assetserver.go | 35 +++++++---- v3/internal/assetserver/assetserver_dev.go | 27 +++----- .../assetserver/assetserver_production.go | 7 +++ v3/internal/assetserver/options.go | 12 ---- v3/internal/commands/watcher.go | 43 +++++++++++++ .../templates/_common/Taskfile.tmpl.yml | 62 +++++++++++++++++-- v3/pkg/application/application.go | 7 +-- v3/pkg/application/options_application.go | 4 -- v3/pkg/application/webview_window_windows.go | 7 ++- 13 files changed, 189 insertions(+), 69 deletions(-) create mode 100644 v3/internal/assetserver/assetserver_production.go create mode 100644 v3/internal/commands/watcher.go diff --git a/mkdocs-website/shared/alpha2.csv b/mkdocs-website/shared/alpha2.csv index a65bac128cf..4cbfcbb7d94 100644 --- a/mkdocs-website/shared/alpha2.csv +++ b/mkdocs-website/shared/alpha2.csv @@ -1,5 +1,5 @@ " ",Mac,Windows,Linux `wails init`,:material-check-bold:,:material-check-bold:,:material-check-bold: `wails build`,:material-check-bold:,:material-check-bold:,:material-check-bold: -`wails dev`," "," "," " +`wails dev`," ",:material-check-bold:," " `wails package`," ",:material-check-bold:,:material-check-bold: diff --git a/v3/cmd/wails3/main.go b/v3/cmd/wails3/main.go index b993072d3eb..2ea7e92ffed 100644 --- a/v3/cmd/wails3/main.go +++ b/v3/cmd/wails3/main.go @@ -53,6 +53,7 @@ func main() { //plugin.NewSubCommandFunction("add", "Add a plugin", commands.PluginAdd) tool := app.NewSubCommand("tool", "Various tools") tool.NewSubCommandFunction("checkport", "Checks if a port is open. Useful for testing if vite is running.", commands.ToolCheckPort) + tool.NewSubCommandFunction("watcher", "Watches files and runs a command when they change", commands.Watcher) app.NewSubCommandFunction("version", "Print the version", commands.Version) diff --git a/v3/go.mod b/v3/go.mod index a40732f36b1..3a6d6718f0b 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -1,8 +1,11 @@ module github.com/wailsapp/wails/v3 -go 1.21 +go 1.21.1 + +toolchain go1.21.4 require ( + github.com/atterpac/refresh v0.2.4 github.com/bep/debounce v1.2.1 github.com/ebitengine/purego v0.4.0-alpha.4 github.com/go-git/go-git/v5 v5.3.0 @@ -22,7 +25,7 @@ require ( github.com/leaanthony/gosod v1.0.3 github.com/leaanthony/u v1.1.0 github.com/leaanthony/winicon v1.0.0 - github.com/lmittmann/tint v1.0.0 + github.com/lmittmann/tint v1.0.3 github.com/markbates/goth v1.77.0 github.com/matryer/is v1.4.0 github.com/mattn/go-colorable v0.1.13 @@ -35,13 +38,14 @@ require ( github.com/wailsapp/go-webview2 v1.0.9 github.com/wailsapp/mimetype v1.4.1 golang.org/x/net v0.10.0 - golang.org/x/sys v0.13.0 + golang.org/x/sys v0.14.0 modernc.org/sqlite v1.21.0 ) require ( atomicgo.dev/cursor v0.1.1 // indirect atomicgo.dev/keyboard v0.2.8 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Microsoft/go-winio v0.4.16 // indirect github.com/StackExchange/wmi v1.2.1 // indirect @@ -77,10 +81,15 @@ require ( github.com/radovskyb/watcher v1.0.7 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rjeczalik/notify v0.9.3 // indirect github.com/sajari/fuzzy v1.0.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect golang.org/x/crypto v0.9.0 // indirect golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect @@ -108,5 +117,3 @@ require ( modernc.org/token v1.0.1 // indirect mvdan.cc/sh/v3 v3.7.0 // indirect ) - -replace github.com/ebitengine/purego v0.4.0-alpha.4 => github.com/tmclane/purego v0.0.0-20230818202843-0b72c8c9140f diff --git a/v3/go.sum b/v3/go.sum index 88b9feb8100..d1f6214559f 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -39,6 +39,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= @@ -63,6 +65,16 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/atterpac/refresh v0.1.0 h1:vFdy+4+Q4X7ENyemskVpGFCGAUt8zi0S05vX1O5tfq8= +github.com/atterpac/refresh v0.1.0/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= +github.com/atterpac/refresh v0.2.1 h1:xWI4PsP88wFJueMq8DscZg+IA3pxMoaS9g8/Gl+p85I= +github.com/atterpac/refresh v0.2.1/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= +github.com/atterpac/refresh v0.2.2 h1:PD+zKYz4LBViPzLUqLPm9p6aiRr6vNd1m1UTHsx8ln8= +github.com/atterpac/refresh v0.2.2/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= +github.com/atterpac/refresh v0.2.3 h1:bV6VGbeUTUFiTvYGKadPZIfIWKhXgUbadHSp8r86JIo= +github.com/atterpac/refresh v0.2.3/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= +github.com/atterpac/refresh v0.2.4 h1:rTD9qchbLa0qPIVr+qpyqkePe6+1Cs14ETXDguEvttI= +github.com/atterpac/refresh v0.2.4/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -83,6 +95,7 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -261,8 +274,8 @@ github.com/lestrrat-go/jwx v1.2.21/go.mod h1:9cfxnOH7G1gN75CaJP2hKGcxFEx5sPh1abR github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lithammer/fuzzysearch v1.1.5 h1:Ag7aKU08wp0R9QCfF4GoGST9HbmAIeLP7xwMrOBEp1c= github.com/lithammer/fuzzysearch v1.1.5/go.mod h1:1R1LRNk7yKid1BaQkmuLQaHruxcC4HmAH30Dh61Ih1Q= -github.com/lmittmann/tint v1.0.0 h1:fzEj70K1L58uyoePQxKe+ezDZJ5pybiWGdA0JeFvvyw= -github.com/lmittmann/tint v1.0.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/lmittmann/tint v1.0.3 h1:W5PHeA2D8bBJVvabNfQD/XW9HPLZK1XoPZH0cq8NouQ= +github.com/lmittmann/tint v1.0.3/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= github.com/markbates/goth v1.77.0 h1:s3scqnWv/Zq/a5M766V0FKsLfOdFNdh/HEkuWCKbvT8= github.com/markbates/goth v1.77.0/go.mod h1:X6xdNgpapSENS0O35iTBBcMHoJDQDfI9bJl+APCkYMc= @@ -318,6 +331,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= +github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY= github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= @@ -328,6 +343,8 @@ github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXn github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -348,6 +365,10 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tc-hib/winres v0.1.6 h1:qgsYHze+BxQPEYilxIz/KCQGaClvI2+yLBAZs+3+0B8= github.com/tc-hib/winres v0.1.6/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmclane/purego v0.0.0-20230818202843-0b72c8c9140f h1:/HXk9aFXP97CJRzOIphm4pzySmJLqIMhKu1kD5usz1E= github.com/tmclane/purego v0.0.0-20230818202843-0b72c8c9140f/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/wailsapp/go-webview2 v1.0.9 h1:lrU+q0cf1wgLdR69rN+ZnRtMJNaJRrcQ4ELxoO7/xjs= @@ -363,6 +384,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= @@ -477,6 +500,7 @@ golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -519,8 +543,10 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/v3/internal/assetserver/assetserver.go b/v3/internal/assetserver/assetserver.go index 5603c97cb6b..59b5faf0dd8 100644 --- a/v3/internal/assetserver/assetserver.go +++ b/v3/internal/assetserver/assetserver.go @@ -8,6 +8,7 @@ import ( "net/http" "net/http/httptest" "net/http/httputil" + "net/url" "strings" "time" @@ -62,6 +63,9 @@ type AssetServer struct { // External dev server proxy wsHandler *httputil.ReverseProxy + // External dev server URL + devServerURL string + assetServerWebView } @@ -91,13 +95,16 @@ func NewAssetServer(options *Options, servingFromDisk bool, logger *slog.Logger, } // Check if proxy required - externalURL, err := options.getExternalURL() - if err != nil { - return nil, err - } - if externalURL != nil { - result.wsHandler = httputil.NewSingleHostReverseProxy(externalURL) - err := result.checkExternalURL() + result.devServerURL = GetDevServerURL() + if result.devServerURL != "" { + logger.Info("Using External DevServer", "url", result.devServerURL) + // Parse devServerURL into url.URL + devserverURL, err := url.Parse(result.devServerURL) + if err != nil { + return nil, err + } + result.wsHandler = httputil.NewSingleHostReverseProxy(devserverURL) + err = result.checkDevServerURL() if err != nil { return nil, err } @@ -105,7 +112,7 @@ func NewAssetServer(options *Options, servingFromDisk bool, logger *slog.Logger, return result, nil } -func (d *AssetServer) checkExternalURL() error { +func (d *AssetServer) checkDevServerURL() error { req, err := http.NewRequest("OPTIONS", "/", nil) if err != nil { return err @@ -113,19 +120,23 @@ func (d *AssetServer) checkExternalURL() error { w := httptest.NewRecorder() d.wsHandler.ServeHTTP(w, req) if w.Code != http.StatusNoContent { - return fmt.Errorf("unable to connect to external server: %s. Please check it's running.", d.options.ExternalURL) + return fmt.Errorf("unable to connect to external server: %s. Please check it's running", d.devServerURL) } return nil } func (d *AssetServer) LogDetails() { if d.debug { - d.logger.Info("AssetServer Info:", + var info = []any{ "assetsFS", d.options.Assets != nil, "middleware", d.options.Middleware != nil, "handler", d.options.Handler != nil, - "externalURL", d.options.ExternalURL, - ) + "devServerURL", d.devServerURL, + } + if d.devServerURL != "" { + info = append(info, "devServerURL", d.devServerURL) + } + d.logger.Info("AssetServer Info:", info...) } } diff --git a/v3/internal/assetserver/assetserver_dev.go b/v3/internal/assetserver/assetserver_dev.go index ae80a74e7d4..c7dde5146e3 100644 --- a/v3/internal/assetserver/assetserver_dev.go +++ b/v3/internal/assetserver/assetserver_dev.go @@ -2,23 +2,10 @@ package assetserver -/* -The assetserver for the dev mode. -Depending on the UserAgent it injects a websocket based IPC script into `index.html` or the default desktop IPC. The -default desktop IPC is injected when the webview accesses the devserver. -*/ -//func NewDevAssetServer(handler http.Handler, servingFromDisk bool, logger *slog.Logger, runtime RuntimeAssets, runtimeHandler RuntimeHandler) (*AssetServer, error) { -// result, err := NewAssetServerWithHandler(handler, servingFromDisk, logger, runtime, true, runtimeHandler) -// if err != nil { -// return nil, err -// } -// -// result.ipcJS = func(req *http.Request) []byte { -// if strings.Contains(req.UserAgent(), WailsUserAgentValue) { -// return runtime.DesktopIPC() -// } -// return runtime.WebsocketIPC() -// } -// -// return result, nil -//} +import ( + "os" +) + +func GetDevServerURL() string { + return os.Getenv("WAILS_DEVSERVER_URL") +} diff --git a/v3/internal/assetserver/assetserver_production.go b/v3/internal/assetserver/assetserver_production.go new file mode 100644 index 00000000000..f87a5a78355 --- /dev/null +++ b/v3/internal/assetserver/assetserver_production.go @@ -0,0 +1,7 @@ +//go:build production + +package assetserver + +func GetDevServerURL() string { + return "" +} diff --git a/v3/internal/assetserver/options.go b/v3/internal/assetserver/options.go index 1ad67cd8c09..674451a0ccc 100644 --- a/v3/internal/assetserver/options.go +++ b/v3/internal/assetserver/options.go @@ -4,7 +4,6 @@ import ( "fmt" "io/fs" "net/http" - "net/url" ) // Options defines the configuration of the AssetServer. @@ -34,10 +33,6 @@ type Options struct { // Multiple Middlewares can be chained together with: // ChainMiddleware(middleware ...Middleware) Middleware Middleware Middleware - - // ExternalURL is the URL that the assets are served from - // This is useful when using a development server like `vite` or `snowpack` which serves the assets on a different port. - ExternalURL string } // Validate the options @@ -48,10 +43,3 @@ func (o Options) Validate() error { return nil } - -func (o Options) getExternalURL() (*url.URL, error) { - if o.ExternalURL == "" { - return nil, nil - } - return url.Parse(o.ExternalURL) -} diff --git a/v3/internal/commands/watcher.go b/v3/internal/commands/watcher.go new file mode 100644 index 00000000000..362d92c4ce9 --- /dev/null +++ b/v3/internal/commands/watcher.go @@ -0,0 +1,43 @@ +package commands + +import ( + "github.com/atterpac/refresh/engine" + "strings" +) + +type WatcherOptions struct { + Path string `description:"The path to watch" default:"."` + PreExec string `description:"The command to run before the main command"` + Exec string `description:"The command to run when a change is detected"` + PostExec string `description:"The command to run after the main command"` + IgnoreFiles string `description:"The files to ignore (comma separated)"` + IgnoreDirs string `description:"The directories to ignore (comma separated)"` + IgnoreExtensions string `description:"The extensions to ignore (comma separated)"` + Debounce int `description:"The debounce time in milliseconds" default:"1000"` + PreWait bool `description:"Wait for the pre-exec command to finish before running the main command"` +} + +func Watcher(options *WatcherOptions) error { + + ignore := engine.Ignore{ + File: strings.Split(options.IgnoreFiles, ","), + Dir: strings.Split(options.IgnoreDirs, ","), + Extension: strings.Split(options.IgnoreExtensions, ","), + } + config := engine.Config{ + RootPath: options.Path, + PreExec: options.PreExec, + ExecCommand: options.Exec, + PostExec: options.PostExec, + Ignore: ignore, + LogLevel: "info", + Debounce: options.Debounce, + PreWait: options.PreWait, + } + + watch := engine.NewEngineFromConfig(config) + + watch.Start() + <-make(chan struct{}) + return nil +} diff --git a/v3/internal/templates/_common/Taskfile.tmpl.yml b/v3/internal/templates/_common/Taskfile.tmpl.yml index 8d2d6b969ad..8b138c63d06 100644 --- a/v3/internal/templates/_common/Taskfile.tmpl.yml +++ b/v3/internal/templates/_common/Taskfile.tmpl.yml @@ -25,6 +25,7 @@ tasks: build:windows: summary: Builds the application for Windows deps: + - task: go:mod:tidy - task: build:frontend - task: generate:icons - task: generate:syso @@ -75,6 +76,7 @@ tasks: build:darwin: summary: Creates a production build of the application deps: + - task: go:mod:tidy - task: build:frontend - task: generate:icons cmds: @@ -85,9 +87,9 @@ tasks: GOOS: darwin CGO_ENABLED: 1 GOARCH: {{ "'{{.ARCH | default ARCH}}'" }} - CGO_CFLAGS: "-mmacosx-version-min=10.13" - CGO_LDFLAGS: "-mmacosx-version-min=10.13" - MACOSX_DEPLOYMENT_TARGET: "10.13" + CGO_CFLAGS: "-mmacosx-version-min=10.15" + CGO_LDFLAGS: "-mmacosx-version-min=10.15" + MACOSX_DEPLOYMENT_TARGET: "10.15" PRODUCTION: {{ "'{{.PRODUCTION | default \"false\"}}'" }} build:darwin:prod:arm64: @@ -126,6 +128,7 @@ tasks: build:linux: summary: Builds the application for Linux deps: + - task: go:mod:tidy - task: build:frontend - task: generate:icons vars: @@ -374,4 +377,55 @@ tasks: deps: - install:frontend:deps cmds: - - npm run build + - npm run build -q + + go:mod:tidy: + summary: Runs `go mod tidy` + internal: true + generates: + - go.sum + sources: + - go.mod + cmds: + - go mod tidy + +# ----------------------- dev ----------------------- # + + + run: + summary: Runs the application + cmds: + - task: run:{{ "{{OS}}" }} + + run:windows: + cmds: + - {{ "'{{.BIN_DIR}}\\\\{{.APP_NAME}}.exe'" }} + + dev:frontend: + summary: Runs the frontend in development mode + dir: frontend + cmds: + - npm run dev + + dev: + summary: Runs the application in development mode + cmds: + - wails3 tool watcher -path {{ "{{.PATH}}" }} -preexec {{ "\"{{.PREEXEC}}\""}} {{ "{{.PREWAIT}}" }} -postexec {{ "\"{{.POSTEXEC}}\"" }} -ignorefiles {{ "{{.IGNOREFILES}}" }} -ignoredirs {{ "{{.IGNOREDIRS}}" }} -ignoreextensions {{ "{{.IGNOREEXTENSIONS}}" }} -exec {{ "\"{{.EXEC}}\"" }} -debounce {{ "{{.DEBOUNCE}}" }} + vars: + PATH: '.' + PREEXEC: 'wails3 task build' + PREWAIT: '-prewait true' + EXEC: 'wails3 task run' + POSTEXEC: '' + IGNOREFILES: 'Taskfile.yml' + IGNOREDIRS: '.git,frontend' + IGNOREEXTENSIONS: '.exe,.syso' + DEBOUNCE: 1000 + env: + # This is the default vite dev server port + WAILS_DEVSERVER_URL: 'http://localhost:5173' + + dev:reload: + summary: Reloads the application + cmds: + - task: run \ No newline at end of file diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 6ce5b62ed8e..881ed6a138e 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -69,10 +69,9 @@ func New(appOptions Options) *App { result.Events = NewWailsEventProcessor(result.dispatchEventToWindows) opts := &assetserver.Options{ - Assets: appOptions.Assets.FS, - Handler: appOptions.Assets.Handler, - Middleware: assetserver.Middleware(appOptions.Assets.Middleware), - ExternalURL: appOptions.Assets.ExternalURL, + Assets: appOptions.Assets.FS, + Handler: appOptions.Assets.Handler, + Middleware: assetserver.Middleware(appOptions.Assets.Middleware), } srv, err := assetserver.NewAssetServer(opts, false, result.Logger, wailsruntime.RuntimeAssetsBundle, result.isDebugMode, NewMessageProcessor(result.Logger)) diff --git a/v3/pkg/application/options_application.go b/v3/pkg/application/options_application.go index ae69f39df8c..5a911e52c19 100644 --- a/v3/pkg/application/options_application.go +++ b/v3/pkg/application/options_application.go @@ -80,10 +80,6 @@ type AssetOptions struct { // Multiple Middlewares can be chained together with: // ChainMiddleware(middleware ...Middleware) Middleware Middleware Middleware - - // External URL can be set to a development server URL so that all requests are forwarded to it. This is useful - // when using a development server like `vite` or `snowpack` which serves the assets on a different port. - ExternalURL string } // Middleware defines HTTP middleware that can be applied to the AssetServer. diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 50c86b97bc1..e9fcd18d1ae 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -1453,11 +1453,12 @@ func (w *windowsWebviewWindow) setupChromium() { chromium.NavigateToString(w.parent.options.HTML) } else { var startURL = "http://wails.localhost" - if globalApplication.options.Assets.ExternalURL != "" { + devServerURL := assetserver.GetDevServerURL() + if devServerURL != "" { // Parse the port - parsedURL, err := url.Parse(globalApplication.options.Assets.ExternalURL) + parsedURL, err := url.Parse(devServerURL) if err != nil { - globalApplication.fatal("Error parsing ExternalURL: " + err.Error()) + globalApplication.fatal("Error parsing environment variable 'WAILS_DEVSERVER_URL`: " + err.Error()) } port := parsedURL.Port() if port != "" {