mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 12:01:42 +08:00
refactored build/serve
This commit is contained in:
parent
fa6cf17079
commit
08a7893b1d
171
cmd/frontend.go
Normal file
171
cmd/frontend.go
Normal 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
|
||||||
|
// }
|
@ -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
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user