5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-04 01:19:12 +08:00

refactored build/serve

This commit is contained in:
Lea Anthony 2019-02-04 18:49:56 +11:00
parent fa6cf17079
commit 08a7893b1d
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
3 changed files with 197 additions and 142 deletions

171
cmd/frontend.go Normal file
View File

@ -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
// }

View File

@ -8,7 +8,6 @@ import (
"path/filepath" "path/filepath"
"runtime" "runtime"
"github.com/leaanthony/slicer"
"github.com/leaanthony/spinner" "github.com/leaanthony/spinner"
"github.com/wailsapp/wails/cmd" "github.com/wailsapp/wails/cmd"
) )
@ -49,20 +48,9 @@ func init() {
// Validate config // Validate config
// Check if we have a frontend // Check if we have a frontend
if projectOptions.FrontEnd != nil { err = cmd.ValidateFrontendConfig(projectOptions)
if projectOptions.FrontEnd.Dir == "" { if err != nil {
return fmt.Errorf("Frontend directory not set in project.json") return err
}
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")
}
} }
// Check pre-requisites are installed // Check pre-requisites are installed
@ -93,6 +81,7 @@ func init() {
// Install deps // Install deps
if projectOptions.FrontEnd != nil { if projectOptions.FrontEnd != nil {
// Install frontend deps // Install frontend deps
err = os.Chdir(projectOptions.FrontEnd.Dir) err = os.Chdir(projectOptions.FrontEnd.Dir)
if err != nil { if err != nil {
@ -156,96 +145,45 @@ func init() {
} }
// Build frontend // Build frontend
buildFESpinner := spinner.New("Building frontend...") err = cmd.BuildFrontend(projectOptions.FrontEnd.Build)
buildFESpinner.SetSpinSpeed(50)
buildFESpinner.Start()
err = program.RunCommand(projectOptions.FrontEnd.Build)
if err != nil { if err != nil {
buildFESpinner.Error()
return err return err
} }
buildFESpinner.Success()
} }
// Run packr in project directory // Move to project directory
err = os.Chdir(projectDir) err = os.Chdir(projectDir)
if err != nil { if err != nil {
return err return err
} }
// Support build tags // Install dependencies
buildTags := []string{} err = cmd.InstallGoDependencies()
depSpinner := spinner.New("Installing Dependencies...")
depSpinner.SetSpinSpeed(50)
depSpinner.Start()
installCommand := "go get"
err = program.RunCommand(installCommand)
if err != nil { if err != nil {
depSpinner.Error()
return err return err
} }
depSpinner.Success()
compileMessage := "Packing + Compiling project" // Build application
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
buildMode := "prod" buildMode := "prod"
if debugMode { if debugMode {
buildMode = "debug" buildMode = "debug"
} }
buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BuildMode=" + buildMode}) err = cmd.BuildApplication(projectOptions.BinaryName, forceRebuild, buildMode)
err = program.RunCommandArray(buildCommand.AsSlice())
if err != nil { if err != nil {
packSpinner.Error()
return err return err
} }
packSpinner.Success()
if packageApp == false { // Package application
logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name) if packageApp {
return nil 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) logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name)
return nil return nil
}) })
} }

View File

@ -10,7 +10,6 @@ import (
"runtime" "runtime"
"time" "time"
"github.com/leaanthony/slicer"
"github.com/leaanthony/spinner" "github.com/leaanthony/spinner"
"github.com/wailsapp/wails/cmd" "github.com/wailsapp/wails/cmd"
) )
@ -47,20 +46,9 @@ func init() {
// Validate config // Validate config
// Check if we have a frontend // Check if we have a frontend
if projectOptions.FrontEnd != nil { err = cmd.ValidateFrontendConfig(projectOptions)
if projectOptions.FrontEnd.Dir == "" { if err != nil {
return fmt.Errorf("Frontend directory not set in project.json") return err
}
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")
}
} }
// Check pre-requisites are installed // Check pre-requisites are installed
@ -154,15 +142,10 @@ func init() {
} }
// Build frontend // Build frontend
buildFESpinner := spinner.New("Building frontend...") err = cmd.BuildFrontend(projectOptions.FrontEnd.Build)
buildFESpinner.SetSpinSpeed(50)
buildFESpinner.Start()
err = program.RunCommand(projectOptions.FrontEnd.Build)
if err != nil { if err != nil {
buildFESpinner.Error()
return err return err
} }
buildFESpinner.Success()
} }
// Run packr in project directory // Run packr in project directory
@ -171,54 +154,17 @@ func init() {
return err return err
} }
// Support build tags // Install dependencies
buildTags := []string{} err = cmd.InstallGoDependencies()
depSpinner := spinner.New("Installing Dependencies...")
depSpinner.SetSpinSpeed(50)
depSpinner.Start()
installCommand := "go get"
err = program.RunCommand(installCommand)
if err != nil { if err != nil {
depSpinner.Error()
return err return err
} }
depSpinner.Success()
compileMessage := "Packing + Compiling project (Bridge Mode)" buildMode := "bridge"
err = cmd.BuildApplication(projectOptions.BinaryName, forceRebuild, buildMode)
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())
if err != nil { if err != nil {
packSpinner.Error()
return err return err
} }
packSpinner.Success()
logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name) logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name)