diff --git a/cmd/frontend.go b/cmd/helpers.go similarity index 65% rename from cmd/frontend.go rename to cmd/helpers.go index bc23e2111..f7814c947 100644 --- a/cmd/frontend.go +++ b/cmd/helpers.go @@ -2,6 +2,11 @@ package cmd import ( "fmt" + "io/ioutil" + "os" + "path" + "path/filepath" + "runtime" "github.com/leaanthony/slicer" "github.com/leaanthony/spinner" @@ -98,6 +103,95 @@ func BuildFrontend(buildCommand string) error { return nil } +func CheckPackr() (err error) { + programHelper := NewProgramHelper() + if !programHelper.IsInstalled("packr") { + buildSpinner := spinner.New() + buildSpinner.SetSpinSpeed(50) + buildSpinner.Start("Installing packr...") + err := programHelper.InstallGoPackage("github.com/gobuffalo/packr/...") + if err != nil { + buildSpinner.Error() + return err + } + buildSpinner.Success() + } + return nil +} + +func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forceRebuild bool) error { + + // Install frontend deps + err := os.Chdir(projectOptions.FrontEnd.Dir) + if err != nil { + return err + } + + // Check if frontend deps have been updated + feSpinner := spinner.New("Installing frontend dependencies (This may take a while)...") + feSpinner.SetSpinSpeed(50) + feSpinner.Start() + + requiresNPMInstall := true + + // Read in package.json MD5 + fs := NewFSHelper() + packageJSONMD5, err := fs.FileMD5("package.json") + if err != nil { + return err + } + + const md5sumFile = "package.json.md5" + + // If we aren't forcing the install and the md5sum file exists + if !forceRebuild && fs.FileExists(md5sumFile) { + // Yes - read contents + savedMD5sum, err := fs.LoadAsString(md5sumFile) + // File exists + if err == nil { + // Compare md5 + if savedMD5sum == packageJSONMD5 { + // Same - no need for reinstall + requiresNPMInstall = false + feSpinner.Success("Skipped frontend dependencies (-f to force rebuild)") + } + } + } + + // Md5 sum package.json + // Different? Build + if requiresNPMInstall || forceRebuild { + // Install dependencies + err = NewProgramHelper().RunCommand(projectOptions.FrontEnd.Install) + if err != nil { + feSpinner.Error() + return err + } + feSpinner.Success() + + // Update md5sum file + ioutil.WriteFile(md5sumFile, []byte(packageJSONMD5), 0644) + } + + bridgeFile := "wailsbridge.prod.js" + + // Copy bridge to project + _, filename, _, _ := runtime.Caller(1) + bridgeFileSource := filepath.Join(path.Dir(filename), "..", "assets", "default", bridgeFile) + bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, projectOptions.FrontEnd.Bridge, "wailsbridge.js") + err = fs.CopyFile(bridgeFileSource, bridgeFileTarget) + if err != nil { + return err + } + + // Build frontend + err = BuildFrontend(projectOptions.FrontEnd.Build) + if err != nil { + return err + } + return nil +} + // func CopyBridgeFile(projectDir string, projectOptions ProjectOptions, bridgeMode bool) error { // // Copy bridge to project // fs := NewFSHelper() diff --git a/cmd/wails/0_setup.go b/cmd/wails/0_setup.go index 8874ed3ae..3baca906d 100644 --- a/cmd/wails/0_setup.go +++ b/cmd/wails/0_setup.go @@ -5,7 +5,6 @@ import ( "runtime" "github.com/leaanthony/spinner" - "github.com/wailsapp/wails/cmd" ) @@ -31,64 +30,29 @@ Create your first project by running 'wails init'.` if runtime.GOOS != "windows" { successMessage = "🚀 " + successMessage } - switch runtime.GOOS { - case "darwin": - logger.Yellow("Detected Platform: OSX") - case "windows": - logger.Yellow("Detected Platform: Windows") - case "linux": - logger.Yellow("Detected Platform: Linux") - default: - return fmt.Errorf("Platform %s is currently not supported", runtime.GOOS) - } - - logger.Yellow("Checking for prerequisites...") - // Check we have a cgo capable environment - - requiredPrograms, err := cmd.GetRequiredPrograms() + // Platform check + err = platformCheck() if err != nil { return err } - errors := false - programHelper := cmd.NewProgramHelper() - for _, program := range *requiredPrograms { - bin := programHelper.FindProgram(program.Name) - if bin == nil { - errors = true - logger.Red("Program '%s' not found. %s", program.Name, program.Help) - } else { - logger.Green("Program '%s' found: %s", program.Name, bin.Path) - } + + // Check we have a cgo capable environment + logger.Yellow("Checking for prerequisites...") + errors, err := checkRequiredPrograms() + if err != nil { + return err } // Linux has library deps - if runtime.GOOS == "linux" { - // Check library prerequisites - requiredLibraries, err := cmd.GetRequiredLibraries() - if err != nil { - return err - } - distroInfo := cmd.GetLinuxDistroInfo() - for _, library := range *requiredLibraries { - switch distroInfo.Distribution { - case cmd.Ubuntu: - installed, err := cmd.DpkgInstalled(library.Name) - if err != nil { - return err - } - if !installed { - errors = true - logger.Red("Library '%s' not found. %s", library.Name, library.Help) - } else { - logger.Green("Library '%s' installed.", library.Name) - } - default: - return fmt.Errorf("unable to check libraries on distribution '%s'. Please ensure that the '%s' equivalent is installed", distroInfo.DistributorID, library.Name) - } - } + errors, err = checkLibraries() + if err != nil { + return err } // packr + err = cmd.CheckPackr() + + programHelper := cmd.NewProgramHelper() if !programHelper.IsInstalled("packr") { buildSpinner := spinner.New() buildSpinner.SetSpinSpeed(50) @@ -110,3 +74,65 @@ Create your first project by running 'wails init'.` return err }) } + +func platformCheck() error { + switch runtime.GOOS { + case "darwin": + logger.Yellow("Detected Platform: OSX") + case "windows": + logger.Yellow("Detected Platform: Windows") + case "linux": + logger.Yellow("Detected Platform: Linux") + default: + return fmt.Errorf("Platform %s is currently not supported", runtime.GOOS) + } + return nil +} + +func checkLibraries() (errors bool, err error) { + if runtime.GOOS == "linux" { + // Check library prerequisites + requiredLibraries, err := cmd.GetRequiredLibraries() + if err != nil { + return false, err + } + distroInfo := cmd.GetLinuxDistroInfo() + for _, library := range *requiredLibraries { + switch distroInfo.Distribution { + case cmd.Ubuntu: + installed, err := cmd.DpkgInstalled(library.Name) + if err != nil { + return false, err + } + if !installed { + errors = true + logger.Red("Library '%s' not found. %s", library.Name, library.Help) + } else { + logger.Green("Library '%s' installed.", library.Name) + } + default: + return false, fmt.Errorf("unable to check libraries on distribution '%s'. Please ensure that the '%s' equivalent is installed", distroInfo.DistributorID, library.Name) + } + } + } + return false, nil +} + +func checkRequiredPrograms() (errors bool, err error) { + requiredPrograms, err := cmd.GetRequiredPrograms() + if err != nil { + return true, err + } + errors = false + programHelper := cmd.NewProgramHelper() + for _, program := range *requiredPrograms { + bin := programHelper.FindProgram(program.Name) + if bin == nil { + errors = true + logger.Red("Program '%s' not found. %s", program.Name, program.Help) + } else { + logger.Green("Program '%s' found: %s", program.Name, bin.Path) + } + } + return +} diff --git a/cmd/wails/4_build.go b/cmd/wails/4_build.go index 93a8c444b..2bb85983f 100644 --- a/cmd/wails/4_build.go +++ b/cmd/wails/4_build.go @@ -2,11 +2,7 @@ package main import ( "fmt" - "io/ioutil" "os" - "path" - "path/filepath" - "runtime" "github.com/leaanthony/spinner" "github.com/wailsapp/wails/cmd" @@ -66,14 +62,9 @@ func init() { } // packr - if !program.IsInstalled("packr") { - buildSpinner.Start("Installing packr...") - err := program.InstallGoPackage("github.com/gobuffalo/packr/...") - if err != nil { - buildSpinner.Error() - return err - } - buildSpinner.Success() + err = cmd.CheckPackr() + if err != nil { + return err } // Save project directory @@ -81,71 +72,7 @@ func init() { // Install deps if projectOptions.FrontEnd != nil { - - // Install frontend deps - err = os.Chdir(projectOptions.FrontEnd.Dir) - if err != nil { - return err - } - - // Check if frontend deps have been updated - feSpinner := spinner.New("Installing frontend dependencies (This may take a while)...") - feSpinner.SetSpinSpeed(50) - feSpinner.Start() - - requiresNPMInstall := true - - // Read in package.json MD5 - packageJSONMD5, err := fs.FileMD5("package.json") - if err != nil { - return err - } - - const md5sumFile = "package.json.md5" - - // If we aren't forcing the install and the md5sum file exists - if !forceRebuild && fs.FileExists(md5sumFile) { - // Yes - read contents - savedMD5sum, err := fs.LoadAsString(md5sumFile) - // File exists - if err == nil { - // Compare md5 - if savedMD5sum == packageJSONMD5 { - // Same - no need for reinstall - requiresNPMInstall = false - feSpinner.Success("Skipped frontend dependencies (-f to force rebuild)") - } - } - } - - // Md5 sum package.json - // Different? Build - if requiresNPMInstall || forceRebuild { - // Install dependencies - err = program.RunCommand(projectOptions.FrontEnd.Install) - if err != nil { - feSpinner.Error() - return err - } - feSpinner.Success() - - // Update md5sum file - ioutil.WriteFile(md5sumFile, []byte(packageJSONMD5), 0644) - } - - bridgeFile := "wailsbridge.prod.js" - - // Copy bridge to project - _, filename, _, _ := runtime.Caller(1) - bridgeFileSource := filepath.Join(path.Dir(filename), "..", "assets", "default", bridgeFile) - bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, projectOptions.FrontEnd.Bridge, "wailsbridge.js") - err = fs.CopyFile(bridgeFileSource, bridgeFileTarget) - if err != nil { - return err - } - - // Build frontend - err = cmd.BuildFrontend(projectOptions.FrontEnd.Build) + err = cmd.InstallFrontendDeps(projectDir, projectOptions, forceRebuild) if err != nil { return err }