diff --git a/cmd/frontend.go b/cmd/frontend.go new file mode 100644 index 000000000..bc23e2111 --- /dev/null +++ b/cmd/frontend.go @@ -0,0 +1,171 @@ +package cmd + +import ( + "fmt" + + "github.com/leaanthony/slicer" + "github.com/leaanthony/spinner" +) + +// ValidateFrontendConfig checks if the frontend config is valid +func ValidateFrontendConfig(projectOptions *ProjectOptions) error { + if projectOptions.FrontEnd.Dir == "" { + return fmt.Errorf("Frontend directory not set in project.json") + } + if projectOptions.FrontEnd.Build == "" { + return fmt.Errorf("Frontend build command not set in project.json") + } + if projectOptions.FrontEnd.Install == "" { + return fmt.Errorf("Frontend install command not set in project.json") + } + if projectOptions.FrontEnd.Bridge == "" { + return fmt.Errorf("Frontend bridge config not set in project.json") + } + + return nil +} + +func InstallGoDependencies() error { + depSpinner := spinner.New("Installing Dependencies...") + depSpinner.SetSpinSpeed(50) + depSpinner.Start() + err := NewProgramHelper().RunCommand("go get") + if err != nil { + depSpinner.Error() + return err + } + depSpinner.Success() + return nil +} + +func BuildApplication(binaryName string, forceRebuild bool, buildMode string) error { + compileMessage := "Packing + Compiling project" + if buildMode == "debug" { + compileMessage += " (Debug Mode)" + } + + packSpinner := spinner.New(compileMessage + "...") + packSpinner.SetSpinSpeed(50) + packSpinner.Start() + + buildCommand := slicer.String() + buildCommand.AddSlice([]string{"packr", "build"}) + + if binaryName != "" { + buildCommand.Add("-o") + buildCommand.Add(binaryName) + } + + // If we are forcing a rebuild + if forceRebuild { + buildCommand.Add("-a") + } + + buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BuildMode=" + buildMode}) + err := NewProgramHelper().RunCommandArray(buildCommand.AsSlice()) + if err != nil { + packSpinner.Error() + return err + } + packSpinner.Success() + return nil +} + +func PackageApplication(projectOptions *ProjectOptions) error { + // Package app + packageSpinner := spinner.New("Packaging Application") + packageSpinner.SetSpinSpeed(50) + packageSpinner.Start() + err := NewPackageHelper().Package(projectOptions) + if err != nil { + packageSpinner.Error() + return err + } + packageSpinner.Success() + return nil +} + +func BuildFrontend(buildCommand string) error { + buildFESpinner := spinner.New("Building frontend...") + buildFESpinner.SetSpinSpeed(50) + buildFESpinner.Start() + err := NewProgramHelper().RunCommand(buildCommand) + if err != nil { + buildFESpinner.Error() + return err + } + buildFESpinner.Success() + return nil +} + +// func CopyBridgeFile(projectDir string, projectOptions ProjectOptions, bridgeMode bool) error { +// // Copy bridge to project +// fs := NewFSHelper() +// var bridgeFile = "wailsbridge.prod.js" +// if bridgeMode { +// bridgeFile = "wailsbridge.js" +// } +// _, filename, _, _ := runtime.Caller(1) +// bridgeFileSource := filepath.Join(path.Dir(filename), "..", "assets", "default", bridgeFile) +// bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, projectOptions.FrontEnd.Bridge, bridgeFile) +// err := fs.CopyFile(bridgeFileSource, bridgeFileTarget) +// if err != nil { +// return err +// } +// return nil +// } + +// func InstallFrontend(projectOptions *ProjectOptions) 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 = program.RunCommand(projectOptions.FrontEnd.Install) +// if err != nil { +// feSpinner.Error() +// return err +// } +// feSpinner.Success() + +// // Update md5sum file +// ioutil.WriteFile(md5sumFile, []byte(packageJSONMD5), 0644) +// } +// return nil +// } diff --git a/cmd/wails/4_build.go b/cmd/wails/4_build.go index 628785158..93a8c444b 100644 --- a/cmd/wails/4_build.go +++ b/cmd/wails/4_build.go @@ -8,7 +8,6 @@ import ( "path/filepath" "runtime" - "github.com/leaanthony/slicer" "github.com/leaanthony/spinner" "github.com/wailsapp/wails/cmd" ) @@ -49,20 +48,9 @@ func init() { // Validate config // Check if we have a frontend - if projectOptions.FrontEnd != nil { - if projectOptions.FrontEnd.Dir == "" { - return fmt.Errorf("Frontend directory not set in project.json") - } - if projectOptions.FrontEnd.Build == "" { - return fmt.Errorf("Frontend build command not set in project.json") - } - if projectOptions.FrontEnd.Install == "" { - return fmt.Errorf("Frontend install command not set in project.json") - } - if projectOptions.FrontEnd.Bridge == "" { - return fmt.Errorf("Frontend bridge config not set in project.json") - } - + err = cmd.ValidateFrontendConfig(projectOptions) + if err != nil { + return err } // Check pre-requisites are installed @@ -93,6 +81,7 @@ func init() { // Install deps if projectOptions.FrontEnd != nil { + // Install frontend deps err = os.Chdir(projectOptions.FrontEnd.Dir) if err != nil { @@ -156,96 +145,45 @@ func init() { } // Build frontend - buildFESpinner := spinner.New("Building frontend...") - buildFESpinner.SetSpinSpeed(50) - buildFESpinner.Start() - err = program.RunCommand(projectOptions.FrontEnd.Build) + err = cmd.BuildFrontend(projectOptions.FrontEnd.Build) if err != nil { - buildFESpinner.Error() return err } - buildFESpinner.Success() } - // Run packr in project directory + // Move to project directory err = os.Chdir(projectDir) if err != nil { return err } - // Support build tags - buildTags := []string{} - - depSpinner := spinner.New("Installing Dependencies...") - depSpinner.SetSpinSpeed(50) - depSpinner.Start() - installCommand := "go get" - err = program.RunCommand(installCommand) + // Install dependencies + err = cmd.InstallGoDependencies() if err != nil { - depSpinner.Error() return err } - depSpinner.Success() - compileMessage := "Packing + Compiling project" - if debugMode { - compileMessage += " (Debug Mode)" - } - - packSpinner := spinner.New(compileMessage + "...") - packSpinner.SetSpinSpeed(50) - packSpinner.Start() - - buildCommand := slicer.String() - buildCommand.AddSlice([]string{"packr", "build"}) - - // Add build tags - if len(buildTags) > 0 { - buildCommand.Add("--tags") - buildCommand.AddSlice(buildTags) - - } - - if projectOptions.BinaryName != "" { - buildCommand.Add("-o") - buildCommand.Add(projectOptions.BinaryName) - } - - // If we are forcing a rebuild - if forceRebuild { - buildCommand.Add("-a") - } - - // Release mode + // Build application buildMode := "prod" if debugMode { buildMode = "debug" } - buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BuildMode=" + buildMode}) - err = program.RunCommandArray(buildCommand.AsSlice()) + err = cmd.BuildApplication(projectOptions.BinaryName, forceRebuild, buildMode) if err != nil { - packSpinner.Error() return err } - packSpinner.Success() - if packageApp == false { - logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name) - return nil + // Package application + if packageApp { + err = cmd.PackageApplication(projectOptions) + if err != nil { + return err + } } - // Package app - packageSpinner := spinner.New("Packaging Application") - packageSpinner.SetSpinSpeed(50) - packageSpinner.Start() - packager := cmd.NewPackageHelper() - err = packager.Package(projectOptions) - if err != nil { - packageSpinner.Error() - return err - } - packageSpinner.Success() logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name) + return nil + }) } diff --git a/cmd/wails/6_serve.go b/cmd/wails/6_serve.go index 6944b5023..42c3327ac 100644 --- a/cmd/wails/6_serve.go +++ b/cmd/wails/6_serve.go @@ -10,7 +10,6 @@ import ( "runtime" "time" - "github.com/leaanthony/slicer" "github.com/leaanthony/spinner" "github.com/wailsapp/wails/cmd" ) @@ -47,20 +46,9 @@ func init() { // Validate config // Check if we have a frontend - if projectOptions.FrontEnd != nil { - if projectOptions.FrontEnd.Dir == "" { - return fmt.Errorf("Frontend directory not set in project.json") - } - if projectOptions.FrontEnd.Build == "" { - return fmt.Errorf("Frontend build command not set in project.json") - } - if projectOptions.FrontEnd.Install == "" { - return fmt.Errorf("Frontend install command not set in project.json") - } - if projectOptions.FrontEnd.Bridge == "" { - return fmt.Errorf("Frontend bridge config not set in project.json") - } - + err = cmd.ValidateFrontendConfig(projectOptions) + if err != nil { + return err } // Check pre-requisites are installed @@ -154,15 +142,10 @@ func init() { } // Build frontend - buildFESpinner := spinner.New("Building frontend...") - buildFESpinner.SetSpinSpeed(50) - buildFESpinner.Start() - err = program.RunCommand(projectOptions.FrontEnd.Build) + err = cmd.BuildFrontend(projectOptions.FrontEnd.Build) if err != nil { - buildFESpinner.Error() return err } - buildFESpinner.Success() } // Run packr in project directory @@ -171,54 +154,17 @@ func init() { return err } - // Support build tags - buildTags := []string{} - - depSpinner := spinner.New("Installing Dependencies...") - depSpinner.SetSpinSpeed(50) - depSpinner.Start() - installCommand := "go get" - err = program.RunCommand(installCommand) + // Install dependencies + err = cmd.InstallGoDependencies() if err != nil { - depSpinner.Error() return err } - depSpinner.Success() - compileMessage := "Packing + Compiling project (Bridge Mode)" - - packSpinner := spinner.New(compileMessage + "...") - packSpinner.SetSpinSpeed(50) - packSpinner.Start() - - buildCommand := slicer.String() - buildCommand.AddSlice([]string{"packr", "build"}) - - // Add build tags - if len(buildTags) > 0 { - buildCommand.Add("--tags") - buildCommand.AddSlice(buildTags) - - } - - if projectOptions.BinaryName != "" { - buildCommand.Add("-o") - buildCommand.Add(projectOptions.BinaryName) - } - - // If we are forcing a rebuild - if forceRebuild { - buildCommand.Add("-a") - } - - // Release mode - buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BuildMode=bridge"}) - err = program.RunCommandArray(buildCommand.AsSlice()) + buildMode := "bridge" + err = cmd.BuildApplication(projectOptions.BinaryName, forceRebuild, buildMode) if err != nil { - packSpinner.Error() return err } - packSpinner.Success() logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name)