From 7572b64bec7aae7e07c3782520fd3e9182f71570 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 3 Oct 2021 15:07:10 +1100 Subject: [PATCH] [v2] Add -devserverurl flag --- v2/cmd/wails/internal/commands/dev/dev.go | 28 ++++++- v2/internal/appng/app_dev.go | 5 ++ .../frontend/desktop/windows/frontend.go | 30 +++++-- v2/internal/frontend/devserver/devserver.go | 79 ++++++++++--------- v2/internal/project/project.go | 5 +- 5 files changed, 100 insertions(+), 47 deletions(-) diff --git a/v2/cmd/wails/internal/commands/dev/dev.go b/v2/cmd/wails/internal/commands/dev/dev.go index 604fa5b26..d1fde6c07 100644 --- a/v2/cmd/wails/internal/commands/dev/dev.go +++ b/v2/cmd/wails/internal/commands/dev/dev.go @@ -27,6 +27,8 @@ import ( "github.com/wailsapp/wails/v2/pkg/commands/build" ) +const defaultDevServerURL = "http://localhost:34115" + func LogGreen(message string, args ...interface{}) { text := fmt.Sprintf(message, args...) println(colour.Green(text)) @@ -96,6 +98,9 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { debounceMS := 100 command.IntFlag("debounce", "The amount of time to wait to trigger a reload on change", &debounceMS) + devServerURL := defaultDevServerURL + command.StringFlag("devserverurl", "The url of the dev server to use", &devServerURL) + command.Action(func() error { // Create logger @@ -132,6 +137,18 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { return err } + if devServerURL == defaultDevServerURL && projectConfig.DevServerURL != defaultDevServerURL && projectConfig.DevServerURL != "" { + devServerURL = projectConfig.DevServerURL + } + + if devServerURL != projectConfig.DevServerURL { + projectConfig.DevServerURL = devServerURL + err := projectConfig.Save() + if err != nil { + return err + } + } + if wailsjsdir == "" && projectConfig.WailsJSDir != "" { wailsjsdir = projectConfig.WailsJSDir } @@ -198,7 +215,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { // Do initial build logger.Println("Building application for development...") - newProcess, appBinary, err := restartApp(logger, buildOptions, debugBinaryProcess, loglevel, passthruArgs, assetDir, false, exitCodeChannel) + newProcess, appBinary, err := restartApp(logger, buildOptions, debugBinaryProcess, loglevel, passthruArgs, assetDir, false, exitCodeChannel, devServerURL) if err != nil { return err } @@ -232,6 +249,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { } LogGreen("Watching (sub)/directory: %s", projectDir) + LogGreen("Using Dev Server URL: %s", devServerURL) // Setup a watcher for non-node_modules directories dirs.Each(func(dir string) { @@ -325,7 +343,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { rebuild = false LogGreen("[Rebuild triggered] files updated") // Try and build the app - newBinaryProcess, _, err = restartApp(logger, buildOptions, debugBinaryProcess, loglevel, passthruArgs, assetDir, false, exitCodeChannel) + newBinaryProcess, _, err = restartApp(logger, buildOptions, debugBinaryProcess, loglevel, passthruArgs, assetDir, false, exitCodeChannel, devServerURL) if err != nil { LogRed("Error during build: %s", err.Error()) continue @@ -370,7 +388,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { return nil } -func restartApp(logger *clilogger.CLILogger, buildOptions *build.Options, debugBinaryProcess *process.Process, loglevel string, passthruArgs []string, assetDir string, firstRun bool, exitCodeChannel chan int) (*process.Process, string, error) { +func restartApp(logger *clilogger.CLILogger, buildOptions *build.Options, debugBinaryProcess *process.Process, loglevel string, passthruArgs []string, assetDir string, firstRun bool, exitCodeChannel chan int, devServerURL string) (*process.Process, string, error) { appBinary, err := build.Build(buildOptions) println() @@ -400,7 +418,9 @@ func restartApp(logger *clilogger.CLILogger, buildOptions *build.Options, debugB if assetDir != "" { args.Add("-assetdir", assetDir) } - + if devServerURL != "" { + args.Add("-devserverurl", devServerURL) + } if len(passthruArgs) > 0 { args.AddSlice(passthruArgs) } diff --git a/v2/internal/appng/app_dev.go b/v2/internal/appng/app_dev.go index 345eb83d0..d61e4cc81 100644 --- a/v2/internal/appng/app_dev.go +++ b/v2/internal/appng/app_dev.go @@ -61,11 +61,16 @@ func CreateApp(appoptions *options.App) (*App, error) { // Check for CLI Flags assetdir := flag.String("assetdir", "", "Directory to serve assets") + devServerURL := flag.String("devserverurl", "http://localhost:34115", "URL of development server") loglevel := flag.String("loglevel", "debug", "Loglevel to use - Trace, Debug, Info, Warning, Error") flag.Parse() + if devServerURL != nil && *devServerURL != "" { + ctx = context.WithValue(ctx, "devserverurl", *devServerURL) + } if assetdir != nil && *assetdir != "" { ctx = context.WithValue(ctx, "assetdir", *assetdir) } + if loglevel != nil && *loglevel != "" { level, err := pkglogger.StringToLogLevel(*loglevel) if err != nil { diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index 6a8004095..8cde58efe 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -35,7 +35,8 @@ type Frontend struct { debug bool // Assets - assets *assetserver.DesktopAssetServer + assets *assetserver.DesktopAssetServer + devServerURL string // main window handle mainWindow *Window @@ -59,19 +60,32 @@ func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger. maxWidth: appoptions.MaxWidth, } + bindingsJSON, err := appBindings.ToJSON() + if err != nil { + log.Fatal(err) + } + + _devServerURL := ctx.Value("devserverurl") + if _devServerURL != nil { + result.devServerURL = _devServerURL.(string) + if result.devServerURL == "" { + result.devServerURL = "http://localhost:34115" + } + if result.devServerURL != "http://localhost:34115" { + return result + } + } + // Check if we have been given a directory to serve assets from. // If so, this means we are in dev mode and are serving assets off disk. // We indicate this through the `servingFromDisk` flag to ensure requests // aren't cached by WebView2 in dev mode + _assetdir := ctx.Value("assetdir") if _assetdir != nil { result.servingFromDisk = true } - bindingsJSON, err := appBindings.ToJSON() - if err != nil { - log.Fatal(err) - } assets, err := assetserver.NewDesktopAssetServer(ctx, appoptions.Assets, bindingsJSON) if err != nil { log.Fatal(err) @@ -306,7 +320,11 @@ func (f *Frontend) setupChromium() { f.WindowSetRGBA(f.frontendOptions.RGBA) chromium.AddWebResourceRequestedFilter("*", edge.COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL) - chromium.Navigate("file://wails/") + if f.devServerURL == "http://localhost:34115" { + chromium.Navigate("file://wails/") + } else { + chromium.Navigate(f.devServerURL) + } } type EventNotify struct { diff --git a/v2/internal/frontend/devserver/devserver.go b/v2/internal/frontend/devserver/devserver.go index 58711d590..638c6bd40 100644 --- a/v2/internal/frontend/devserver/devserver.go +++ b/v2/internal/frontend/devserver/devserver.go @@ -93,47 +93,54 @@ func (d *DevWebServer) Run(ctx context.Context) error { } })) - _assetdir := ctx.Value("assetdir") - if _assetdir == nil { - return fmt.Errorf("no assetdir provided") + _devServerURL := ctx.Value("devserverurl") + if _devServerURL == "http://localhost:34115" { + // Setup internal dev server + _assetdir := ctx.Value("assetdir") + if _assetdir == nil { + return fmt.Errorf("no assetdir provided") + } + if _assetdir != nil { + assetdir := _assetdir.(string) + bindingsJSON, err := d.appBindings.ToJSON() + if err != nil { + log.Fatal(err) + } + d.assetServer, err = assetserver.NewBrowserAssetServer(assetdir, bindingsJSON, d.appoptions) + if err != nil { + log.Fatal(err) + } + absdir, err := filepath.Abs(assetdir) + if err != nil { + return err + } + d.LogDebug("Serving assets from: %s", absdir) + } + + d.server.Get("*", d.loadAsset) + + // Start server + go func(server *fiber.App, log *logger.Logger) { + err := server.Listen("localhost:34115") + if err != nil { + log.Error(err.Error()) + } + d.LogDebug("Shutdown completed") + }(d.server, d.logger) + + d.LogDebug("Serving application at http://localhost:34115") + + defer func() { + err := d.server.Shutdown() + if err != nil { + d.logger.Error(err.Error()) + } + }() } - if _assetdir != nil { - assetdir := _assetdir.(string) - bindingsJSON, err := d.appBindings.ToJSON() - if err != nil { - log.Fatal(err) - } - d.assetServer, err = assetserver.NewBrowserAssetServer(assetdir, bindingsJSON, d.appoptions) - if err != nil { - log.Fatal(err) - } - absdir, err := filepath.Abs(assetdir) - if err != nil { - return err - } - d.LogDebug("Serving assets from: %s", absdir) - } - - d.server.Get("*", d.loadAsset) - - // Start server - go func(server *fiber.App, log *logger.Logger) { - err := server.Listen("localhost:34115") - if err != nil { - log.Error(err.Error()) - } - d.LogDebug("Shutdown completed") - }(d.server, d.logger) - - d.LogDebug("Serving application at http://localhost:34115") // Launch desktop app err := d.desktopFrontend.Run(ctx) d.LogDebug("Starting shutdown") - err2 := d.server.Shutdown() - if err2 != nil { - d.logger.Error(err.Error()) - } return err } diff --git a/v2/internal/project/project.go b/v2/internal/project/project.go index 6fbf1391b..ed9c67e6c 100644 --- a/v2/internal/project/project.go +++ b/v2/internal/project/project.go @@ -47,8 +47,11 @@ type Project struct { // Fully qualified filename filename string - // The debounce time for hot-reload of the built-in dev server + // The debounce time for hot-reload of the built-in dev server. Default 100 DebounceMS int `json:"debounceMS"` + + // The url to use to server assets. Default "https://localhost:34115" + DevServerURL string `json:"devserverurl"` } func (p *Project) Save() error {