From 8d3c32c630089d2c11df699a38c948a8dd0cbf82 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 23 Feb 2020 06:03:00 +1100 Subject: [PATCH] Add verbose flag (#350) * Implement verbose output Works for build and serve * Tidy go modules --- cmd/helpers.go | 134 ++++++++++++++++++++++++++++++------------- cmd/program.go | 43 +++++++++----- cmd/project.go | 1 + cmd/shell.go | 42 ++++++++++---- cmd/wails/0_setup.go | 2 +- cmd/wails/4_build.go | 5 +- cmd/wails/6_serve.go | 7 ++- go.mod | 3 - go.sum | 8 --- 9 files changed, 164 insertions(+), 81 deletions(-) diff --git a/cmd/helpers.go b/cmd/helpers.go index 1f4410d8b..bfb033aa7 100644 --- a/cmd/helpers.go +++ b/cmd/helpers.go @@ -36,16 +36,23 @@ func ValidateFrontendConfig(projectOptions *ProjectOptions) error { } // InstallGoDependencies will run go get in the current directory -func InstallGoDependencies() error { - depSpinner := spinner.New("Ensuring Dependencies are up to date...") - depSpinner.SetSpinSpeed(50) - depSpinner.Start() - err := NewProgramHelper().RunCommand("go get") +func InstallGoDependencies(verbose bool) error { + var depSpinner *spinner.Spinner + if !verbose { + depSpinner = spinner.New("Ensuring Dependencies are up to date...") + depSpinner.SetSpinSpeed(50) + depSpinner.Start() + } + err := NewProgramHelper(verbose).RunCommand("go get") if err != nil { - depSpinner.Error() + if !verbose { + depSpinner.Error() + } return err } - depSpinner.Success() + if !verbose { + depSpinner.Success() + } return nil } @@ -62,7 +69,7 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa } // Check Mewn is installed - err := CheckMewn() + err := CheckMewn(projectOptions.Verbose) if err != nil { return err } @@ -73,9 +80,14 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa compileMessage += " (Debug Mode)" } - packSpinner := spinner.New(compileMessage + "...") - packSpinner.SetSpinSpeed(50) - packSpinner.Start() + var packSpinner *spinner.Spinner + if !projectOptions.Verbose { + packSpinner = spinner.New(compileMessage + "...") + packSpinner.SetSpinSpeed(50) + packSpinner.Start() + } else { + println(compileMessage) + } buildCommand := slicer.String() buildCommand.Add("mewn") @@ -131,12 +143,16 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa } buildCommand.AddSlice([]string{"-ldflags", ldflags}) - err = NewProgramHelper().RunCommandArray(buildCommand.AsSlice()) + err = NewProgramHelper(projectOptions.Verbose).RunCommandArray(buildCommand.AsSlice()) if err != nil { - packSpinner.Error() + if packSpinner != nil { + packSpinner.Error() + } return err } - packSpinner.Success() + if packSpinner != nil { + packSpinner.Success() + } // packageApp if packageApp { @@ -160,45 +176,68 @@ func PackageApplication(projectOptions *ProjectOptions) error { } message = "Generating resource bundle" } - packageSpinner := spinner.New(message) - packageSpinner.SetSpinSpeed(50) - packageSpinner.Start() + var packageSpinner *spinner.Spinner + if projectOptions.Verbose { + packageSpinner = spinner.New(message) + packageSpinner.SetSpinSpeed(50) + packageSpinner.Start() + } err := NewPackageHelper().Package(projectOptions) if err != nil { - packageSpinner.Error() + if packageSpinner != nil { + packageSpinner.Error() + } return err } - packageSpinner.Success() + if packageSpinner != nil { + packageSpinner.Success() + } return nil } // BuildFrontend runs the given build command -func BuildFrontend(buildCommand string) error { - buildFESpinner := spinner.New("Building frontend...") - buildFESpinner.SetSpinSpeed(50) - buildFESpinner.Start() - err := NewProgramHelper().RunCommand(buildCommand) +func BuildFrontend(projectOptions *ProjectOptions) error { + var buildFESpinner *spinner.Spinner + if !projectOptions.Verbose { + buildFESpinner = spinner.New("Building frontend...") + buildFESpinner.SetSpinSpeed(50) + buildFESpinner.Start() + } else { + println("Building frontend...") + } + err := NewProgramHelper(projectOptions.Verbose).RunCommand(projectOptions.FrontEnd.Build) if err != nil { - buildFESpinner.Error() + if buildFESpinner != nil { + buildFESpinner.Error() + } return err } - buildFESpinner.Success() + if buildFESpinner != nil { + buildFESpinner.Success() + } return nil } // CheckMewn checks if mewn is installed and if not, attempts to fetch it -func CheckMewn() (err error) { - programHelper := NewProgramHelper() +func CheckMewn(verbose bool) (err error) { + programHelper := NewProgramHelper(verbose) if !programHelper.IsInstalled("mewn") { - buildSpinner := spinner.New() - buildSpinner.SetSpinSpeed(50) - buildSpinner.Start("Installing Mewn asset packer...") + var buildSpinner *spinner.Spinner + if !verbose { + buildSpinner = spinner.New() + buildSpinner.SetSpinSpeed(50) + buildSpinner.Start("Installing Mewn asset packer...") + } err := programHelper.InstallGoPackage("github.com/leaanthony/mewn/cmd/mewn") if err != nil { - buildSpinner.Error() + if buildSpinner != nil { + buildSpinner.Error() + } return err } - buildSpinner.Success() + if buildSpinner != nil { + buildSpinner.Success() + } } return nil } @@ -225,9 +264,14 @@ func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forc } // Check if frontend deps have been updated - feSpinner := spinner.New("Ensuring frontend dependencies are up to date (This may take a while)") - feSpinner.SetSpinSpeed(50) - feSpinner.Start() + var feSpinner *spinner.Spinner + if !projectOptions.Verbose { + feSpinner = spinner.New("Ensuring frontend dependencies are up to date (This may take a while)") + feSpinner.SetSpinSpeed(50) + feSpinner.Start() + } else { + println("Ensuring frontend dependencies are up to date (This may take a while)") + } requiresNPMInstall := true @@ -259,7 +303,11 @@ func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forc if savedMD5sum == packageJSONMD5 { // Same - no need for reinstall requiresNPMInstall = false - feSpinner.Success("Skipped frontend dependencies (-f to force rebuild)") + if feSpinner != nil { + feSpinner.Success("Skipped frontend dependencies (-f to force rebuild)") + } else { + println("Skipped frontend dependencies (-f to force rebuild)") + } } } } @@ -268,12 +316,16 @@ func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forc // Different? Build if requiresNPMInstall || forceRebuild { // Install dependencies - err = NewProgramHelper().RunCommand(projectOptions.FrontEnd.Install) + err = NewProgramHelper(projectOptions.Verbose).RunCommand(projectOptions.FrontEnd.Install) if err != nil { - feSpinner.Error() + if feSpinner != nil { + feSpinner.Error() + } return err } - feSpinner.Success() + if feSpinner != nil { + feSpinner.Success() + } // Update md5sum file ioutil.WriteFile(md5sumFile, []byte(packageJSONMD5), 0644) @@ -286,7 +338,7 @@ func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forc } // Build frontend - err = BuildFrontend(projectOptions.FrontEnd.Build) + err = BuildFrontend(projectOptions) if err != nil { return err } diff --git a/cmd/program.go b/cmd/program.go index 81816bdb3..e43133272 100644 --- a/cmd/program.go +++ b/cmd/program.go @@ -3,6 +3,7 @@ package cmd import ( "bytes" "fmt" + "os" "os/exec" "path/filepath" "strings" @@ -11,14 +12,22 @@ import ( // ProgramHelper - Utility functions around installed applications type ProgramHelper struct { - shell *ShellHelper + shell *ShellHelper + verbose bool } // NewProgramHelper - Creates a new ProgramHelper -func NewProgramHelper() *ProgramHelper { - return &ProgramHelper{ +func NewProgramHelper(verbose ...bool) *ProgramHelper { + result := &ProgramHelper{ shell: NewShellHelper(), } + if len(verbose) > 0 { + result.verbose = verbose[0] + if result.verbose { + result.shell.SetVerbose() + } + } + return result } // IsInstalled tries to determine if the given binary name is installed @@ -29,8 +38,9 @@ func (p *ProgramHelper) IsInstalled(programName string) bool { // Program - A struct to define an installed application/binary type Program struct { - Name string `json:"name"` - Path string `json:"path"` + Name string `json:"name"` + Path string `json:"path"` + verbose bool } // FindProgram attempts to find the given program on the system.FindProgram @@ -45,8 +55,9 @@ func (p *ProgramHelper) FindProgram(programName string) *Program { return nil } return &Program{ - Name: programName, - Path: path, + Name: programName, + Path: path, + verbose: p.verbose, } } @@ -63,12 +74,18 @@ func (p *Program) Run(vars ...string) (stdout, stderr string, exitCode int, err return "", "", 1, err } cmd := exec.Command(command, vars...) - var stdo, stde bytes.Buffer - cmd.Stdout = &stdo - cmd.Stderr = &stde - err = cmd.Run() - stdout = string(stdo.Bytes()) - stderr = string(stde.Bytes()) + if !p.verbose { + var stdo, stde bytes.Buffer + cmd.Stdout = &stdo + cmd.Stderr = &stde + err = cmd.Run() + stdout = string(stdo.Bytes()) + stderr = string(stde.Bytes()) + } else { + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + } // https://stackoverflow.com/questions/10385551/get-exit-code-go if err != nil { diff --git a/cmd/project.go b/cmd/project.go index 1ecb52726..d4e878a0e 100644 --- a/cmd/project.go +++ b/cmd/project.go @@ -158,6 +158,7 @@ type ProjectOptions struct { selectedTemplate *TemplateDetails WailsVersion string typescriptDefsFilename string + Verbose bool `json:"-"` } // Defaults sets the default project template diff --git a/cmd/shell.go b/cmd/shell.go index 765d9ae06..53c227de0 100644 --- a/cmd/shell.go +++ b/cmd/shell.go @@ -8,6 +8,7 @@ import ( // ShellHelper helps with Shell commands type ShellHelper struct { + verbose bool } // NewShellHelper creates a new ShellHelper! @@ -15,16 +16,27 @@ func NewShellHelper() *ShellHelper { return &ShellHelper{} } +// SetVerbose sets the verbose flag +func (sh *ShellHelper) SetVerbose() { + sh.verbose = true +} + // Run the given command func (sh *ShellHelper) Run(command string, vars ...string) (stdout, stderr string, err error) { cmd := exec.Command(command, vars...) cmd.Env = append(os.Environ(), "GO111MODULE=on") - var stdo, stde bytes.Buffer - cmd.Stdout = &stdo - cmd.Stderr = &stde - err = cmd.Run() - stdout = string(stdo.Bytes()) - stderr = string(stde.Bytes()) + if !sh.verbose { + var stdo, stde bytes.Buffer + cmd.Stdout = &stdo + cmd.Stderr = &stde + err = cmd.Run() + stdout = string(stdo.Bytes()) + stderr = string(stde.Bytes()) + } else { + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + } return } @@ -33,11 +45,17 @@ func (sh *ShellHelper) RunInDirectory(dir string, command string, vars ...string cmd := exec.Command(command, vars...) cmd.Dir = dir cmd.Env = append(os.Environ(), "GO111MODULE=on") - var stdo, stde bytes.Buffer - cmd.Stdout = &stdo - cmd.Stderr = &stde - err = cmd.Run() - stdout = string(stdo.Bytes()) - stderr = string(stde.Bytes()) + if !sh.verbose { + var stdo, stde bytes.Buffer + cmd.Stdout = &stdo + cmd.Stderr = &stde + err = cmd.Run() + stdout = string(stdo.Bytes()) + stderr = string(stde.Bytes()) + } else { + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + } return } diff --git a/cmd/wails/0_setup.go b/cmd/wails/0_setup.go index e3a035948..bab0949d4 100644 --- a/cmd/wails/0_setup.go +++ b/cmd/wails/0_setup.go @@ -40,7 +40,7 @@ Create your first project by running 'wails init'.` } // Check Mewn - err = cmd.CheckMewn() + err = cmd.CheckMewn(false) if err != nil { return err } diff --git a/cmd/wails/4_build.go b/cmd/wails/4_build.go index c5398c075..40d7415c5 100644 --- a/cmd/wails/4_build.go +++ b/cmd/wails/4_build.go @@ -14,6 +14,7 @@ func init() { var forceRebuild = false var debugMode = false var typescriptFilename = "" + var verbose = false buildSpinner := spinner.NewSpinner() buildSpinner.SetSpinSpeed(50) @@ -24,6 +25,7 @@ func init() { BoolFlag("p", "Package application on successful build", &packageApp). BoolFlag("f", "Force rebuild of application components", &forceRebuild). BoolFlag("d", "Build in Debug mode", &debugMode). + BoolFlag("verbose", "Verbose output", &verbose). StringFlag("t", "Generate Typescript definitions to given file (at runtime)", &typescriptFilename) initCmd.Action(func() error { @@ -40,6 +42,7 @@ func init() { // Project options projectOptions := &cmd.ProjectOptions{} + projectOptions.Verbose = verbose // Check we are in project directory // Check project.json loads correctly @@ -90,7 +93,7 @@ func init() { } // Install dependencies - err = cmd.InstallGoDependencies() + err = cmd.InstallGoDependencies(projectOptions.Verbose) if err != nil { return err } diff --git a/cmd/wails/6_serve.go b/cmd/wails/6_serve.go index eaa1b89af..a6d18ac23 100644 --- a/cmd/wails/6_serve.go +++ b/cmd/wails/6_serve.go @@ -10,12 +10,14 @@ import ( func init() { var forceRebuild = false + var verbose = false buildSpinner := spinner.NewSpinner() buildSpinner.SetSpinSpeed(50) commandDescription := `This command builds then serves your application in bridge mode. Useful for developing your app in a browser.` initCmd := app.Command("serve", "Run your Wails project in bridge mode"). LongDescription(commandDescription). + BoolFlag("verbose", "Verbose output", &verbose). BoolFlag("f", "Force rebuild of application components", &forceRebuild) initCmd.Action(func() error { @@ -25,13 +27,14 @@ func init() { fmt.Println() // Check Mewn is installed - err := cmd.CheckMewn() + err := cmd.CheckMewn(verbose) if err != nil { return err } // Project options projectOptions := &cmd.ProjectOptions{} + projectOptions.Verbose = verbose // Check we are in project directory // Check project.json loads correctly @@ -51,7 +54,7 @@ func init() { } // Install dependencies - err = cmd.InstallGoDependencies() + err = cmd.InstallGoDependencies(projectOptions.Verbose) if err != nil { return err } diff --git a/go.mod b/go.mod index 8080133bf..5f62b2058 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,6 @@ module github.com/wailsapp/wails require ( github.com/Masterminds/semver v1.4.2 github.com/abadojack/whatlanggo v1.0.1 - github.com/dchest/cssmin v0.0.0-20151210170030-fb8d9b44afdc // indirect - github.com/dchest/htmlmin v0.0.0-20150526090704-e254725e81ac - github.com/dchest/jsmin v0.0.0-20160823214000-faeced883947 // indirect github.com/fatih/color v1.7.0 github.com/go-playground/colors v1.2.0 github.com/gorilla/websocket v1.4.0 diff --git a/go.sum b/go.sum index 3c9d0b42a..24fc4f54c 100644 --- a/go.sum +++ b/go.sum @@ -7,12 +7,6 @@ github.com/abadojack/whatlanggo v1.0.1/go.mod h1:66WiQbSbJBIlOZMsvbKe5m6pzQovxCH github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dchest/cssmin v0.0.0-20151210170030-fb8d9b44afdc h1:VBS1z48BFEe00G81z8MKOtwX7f/ISkuH38NscT8iVPw= -github.com/dchest/cssmin v0.0.0-20151210170030-fb8d9b44afdc/go.mod h1:ABJPuor7YlcsHmvJ1QxX38e2NcufLY3hm0yXv+cy9sI= -github.com/dchest/htmlmin v0.0.0-20150526090704-e254725e81ac h1:DpMwFluHWoZpV9ex5XjkWO4HyCz5HLVI8XbHw0FhHi4= -github.com/dchest/htmlmin v0.0.0-20150526090704-e254725e81ac/go.mod h1:XsAE+b4rOZc8gvgsgF+wU75mNBvBcyED1wdd9PBLlJ0= -github.com/dchest/jsmin v0.0.0-20160823214000-faeced883947 h1:Fm10/KNuoAyBm2P5P5H91Xy21hGcZnBdjR+cMdytv1M= -github.com/dchest/jsmin v0.0.0-20160823214000-faeced883947/go.mod h1:Dv9D0NUlAsaQcGQZa5kc5mqR9ua72SmA8VXi4cd+cBw= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/go-playground/colors v1.2.0 h1:0EdjTXKrr2g1L/LQTYtIqabeHpZuGZz1U4osS1T8+5M= @@ -34,8 +28,6 @@ github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/leaanthony/mewn v0.10.7 h1:jCcNJyIUOpwj+I5SuATvCugDjHkoo+j6ubEOxxrxmPA= github.com/leaanthony/mewn v0.10.7/go.mod h1:CRkTx8unLiSSilu/Sd7i1LwrdaAL+3eQ3ses99qGMEQ= -github.com/leaanthony/slicer v1.3.2 h1:kGWWFoyaY5WzwGrUsHXMmGbssuYthP4qYBNlkNpNAB8= -github.com/leaanthony/slicer v1.3.2/go.mod h1:VMB/HGvr3uR3MRpFWHWAm0w+DHQLzPHYe2pKfpFlQIQ= github.com/leaanthony/slicer v1.4.0 h1:Q9u4w+UBU4WHjXnEDdz+eRLMKF/rnyosRBiqULnc1J8= github.com/leaanthony/slicer v1.4.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= github.com/leaanthony/spinner v0.5.3 h1:IMTvgdQCec5QA4qRy0wil4XsRP+QcG1OwLWVK/LPZ5Y=