Fixed wails serve. Improved code structure.

This commit is contained in:
Lea Anthony
2019-02-04 08:45:12 +11:00
parent b713d57168
commit fa6cf17079
6 changed files with 140 additions and 55 deletions

View File

@@ -2,4 +2,4 @@ package cmd
// Version - Wails version
// ...oO(There must be a better way)
const Version = "v0.7.0"
const Version = "v0.7.2"

View File

@@ -91,7 +91,7 @@ func init() {
// Save project directory
projectDir := fs.Cwd()
// Install backend deps - needed?
// Install deps
if projectOptions.FrontEnd != nil {
// Install frontend deps
err = os.Chdir(projectOptions.FrontEnd.Dir)
@@ -217,10 +217,11 @@ func init() {
}
// Release mode
logger.Red("debugMode = %t", debugMode)
if !debugMode {
buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.DebugMode=false"})
buildMode := "prod"
if debugMode {
buildMode = "debug"
}
buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BuildMode=" + buildMode})
err = program.RunCommandArray(buildCommand.AsSlice())
if err != nil {
packSpinner.Error()

View File

@@ -1,6 +1,8 @@
package main
import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"path"
@@ -20,7 +22,7 @@ func init() {
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", "Runs your Wails project in bridge mode").
initCmd := app.Command("serve", "Run your Wails project in bridge mode.").
LongDescription(commandDescription).
BoolFlag("f", "Force rebuild of application components", &forceRebuild)
@@ -43,9 +45,36 @@ func init() {
return err
}
// 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")
}
}
// Check pre-requisites are installed
// Program checker
program := cmd.NewProgramHelper()
if projectOptions.FrontEnd != nil {
// npm
if !program.IsInstalled("npm") {
return fmt.Errorf("it appears npm is not installed. Please install and run again")
}
}
// packr
if !program.IsInstalled("packr") {
buildSpinner.Start("Installing packr...")
@@ -60,14 +89,80 @@ func init() {
// Save project directory
projectDir := fs.Cwd()
// Copy bridge to project
var 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, "wailsbridge.js")
err = fs.CopyFile(bridgeFileSource, bridgeFileTarget)
if err != nil {
return err
// 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
buildFESpinner := spinner.New("Building frontend...")
buildFESpinner.SetSpinSpeed(50)
buildFESpinner.Start()
err = program.RunCommand(projectOptions.FrontEnd.Build)
if err != nil {
buildFESpinner.Error()
return err
}
buildFESpinner.Success()
}
// Run packr in project directory
@@ -90,7 +185,7 @@ func init() {
}
depSpinner.Success()
compileMessage := "Packing + Compiling project"
compileMessage := "Packing + Compiling project (Bridge Mode)"
packSpinner := spinner.New(compileMessage + "...")
packSpinner.SetSpinSpeed(50)
@@ -116,8 +211,8 @@ func init() {
buildCommand.Add("-a")
}
buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BackendRenderer=headless"})
// logger.Green("buildCommand = %+v", buildCommand)
// Release mode
buildCommand.AddSlice([]string{"-ldflags", "-X github.com/wailsapp/wails.BuildMode=bridge"})
err = program.RunCommandArray(buildCommand.AsSlice())
if err != nil {
packSpinner.Error()
@@ -125,14 +220,19 @@ func init() {
}
packSpinner.Success()
// Run the App
logger.Yellow("Awesome! Project '%s' built!", projectOptions.Name)
go func() {
time.Sleep(2 * time.Second)
logger.Green(">>>>> To connect, you will need to run '" + projectOptions.FrontEnd.Serve + "' in the '" + projectOptions.FrontEnd.Dir + "' directory <<<<<")
}()
logger.Yellow("Serving Application: " + projectOptions.BinaryName)
cmd := exec.Command(projectOptions.BinaryName)
location, err := filepath.Abs(projectOptions.BinaryName)
if err != nil {
return err
}
logger.Yellow("Serving Application: " + location)
cmd := exec.Command(location)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
@@ -141,6 +241,5 @@ func init() {
}
return nil
})
}