mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:51:26 +08:00

* feat: attempt to support Zorin * chore: bump version * Add support for Gentoo * docs: update contributors * feat: test support for Fedora * chore: version bump * Update README.md * feat: major refactor * fix: config errors * fix: capitalisation and binding fix * fix: lint * fix: linting * config: eslint * fix: more lint fixes * fix: linting for hound * Even more fixes * chore: bump version * fix: eslintrc config * fix: renamed global logger * fix: Print stdout on error :rolleyes: * fix: add promises polyfill for the windows target * style: replace double quotes with single quotes * Update contributors * feat: significant overhaul of runtime * chore: Version Bump * Fix Masterminds/semver reference import path (case-sensitivity) * drop lsb_release Signed-off-by: Chronophylos <nikolai@chronophylos.com> * change DistributionID to NAME= Signed-off-by: Chronophylos <nikolai@chronophylos.com> * show distro id when creating a issue Signed-off-by: Chronophylos <nikolai@chronophylos.com> * fix assumption Signed-off-by: Chronophylos <nikolai@chronophylos.com> * docs: updated contributors * fix: add support back for ubuntu, redhat * chore: version bump * fix(linux): fedora & centos support * feat: gcc,npm,node versions on issues * linux working * darwin working * feat: show gcc, node, npm version on issue report * Delete npm-debug.log * fix: crashing typo * trim gcc string * chore: version bump * fix: gitbash fixes * chore: hotfix * fix: issue report * fix: typo * chore: hotfix version bump * 179 parrot distributionsupport (#181) * feat: parrot support && git push * feat: parrot support * feat: parrot support * fix: arch support * fix: gentoos support * Update README.md * Update README.md * chore: bump version * Linux db (#182) * feat: refactor linux distro detection * linux db updates * feat: add gccversioncommand + windows support * fix: build-essential * chore: linter fixes (#185) * 182 linux bd (#183) * fix: linuxdb.yaml entries * fix: typo * fix: yaml syntax error * 188 support distribution linux mint (#189) * chore: update linux db * chore: bump version * chore: merge webview back in * chore: rename webview for clarity * chore: add stale issue bot config * chore: add inprogress label * Azure Pipelines (#192) * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * chore: remove unused mewn file * chore: deduplicate library verificaation code * Update contributors * fix: undefined: webview during build * feat: VoidLinux support * Yaml bug (#207) * test: azure pipeline * fix: azure pipeline yaml * feat: elementary support * feat: opensuse support * fix: 0_setup.go line 27 * fix: 0_setup.go line 27 * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: yaml * fix: yaml * fix: yaml * fix: opensuse yaml * fix: opensuse * fix: opensuse * fix: opensuse * fix: opensuse * fix: string trim os osRelease field NAME * fix: 0_setup.go if err typo * test * test * fix: typo in linux.go * test: remove quotes from opensuse case * test: revert * test: "" * test: "" * test: "" * test: "" * fix: replace trim with replace * fix: drop 0_setup.go and run checks by system.go * fix: elementary os yaml name * fix: open suse yaml entry * fix: commented out result.Release = version * fix: commented out result.Release = version * fix: revert Replace to Trim * fix: Linux Mint yaml entry * fix: capitalize distros entries * fix: capitalize distros entries * fix: capitalize distros entries * test * test * fix: open suse yaml entry * fix: yaml entris * test * test * test * test * test * test * branch changing * fix: bug in setup process * debugging * debugging * debugging * debugging * fix: yaml entries & err == nil bug * Update prerequisites.go * fix: bug * fix: 0_setup.go * fix: yaml bug * fix: yaml bug * chore: bump version * Elementary support + readme update (#210) * test: azure pipeline * fix: azure pipeline yaml * feat: elementary support+readme udpate * fix: upgrade eslint * 215 support distribution kali (#219) * test: azure pipeline * fix: azure pipeline yaml * feat: kali linux support * feat: kali linux support * fix: allow 0 return types * duplicate code spotted (#221) * fix: duplicate code * chore: release v0.17.14-pre * chore: remove debug output * (FIX) 215 support distribution kali (#224) * fix: kali support * docs: add Mattn * feat: KDE neon support (#234) * chore: version bump * chore: remove some debug output * fix: binding more than one struct method (#245) * feat: add runtime typings * fix: multiple runtime fixes * manjaro (#248) * manjaro * Update go.mod * chore: version bump * fix: update runtime * chore: version bump * cmd/wails: report error status code to OS (#252) Fixes #251. * Update CONTRIBUTORS.md * chore: version bump * fix: importing runtime (#254) * chore: supress warnings * Patch for file dialog on OSX (#258) * Patch for file dialog on OSX * Update CONTRIBUTORS.md * 262 add wails shutdown method (#264) * feat: support close in bridge mode * feat: WailsShutdown callback Now handles proper shutdown through: * runtime.Window.Close() * Killing the main window * Ctrl-C * chore: version bump * fix: force install when node_modules missing (#268) * fix: detect encoding on windows (#266) * fix: linting * chore: bump version * Migrate tool (#270) Experimental migration tool for projects < v1.0.0 * chore: version bump * fix: add flag to fix windows builds (#272) * Bump version to v0.18.9-pre * 261 korean fonts (#273) * fix: linting * chore: bump version * fix: unicode text for Windows * release v0.18.10-pre * 274 support spaces in windows paths (#275) * fix: escape windows commands * fix: allow spaces in path to windres * Update go.mod * release v0.18.11-pre * 261 korean fonts (#276) * fix: linting * chore: bump version * fix: unicode text for Windows * fix: re-add webview_set_title * release v0.18.12-pre * hotfix: build issue for windows * fix: npm/node version reporting * fix: debug build should use terminal * fix: make binary name more os specific * Backport (#283) * Develop (#265) * Patch for file dialog on OSX * Update CONTRIBUTORS.md * 262 add wails shutdown method (#264) * feat: support close in bridge mode * feat: WailsShutdown callback Now handles proper shutdown through: * runtime.Window.Close() * Killing the main window * Ctrl-C * chore: version bump * chore: version bump * feat: adjust binary name for OS * fix: allow spaces in gcc path * feat: migrate command * fix: npm/node versions * fix: allow IE for serve * feat: go build script * fix: make runtime ES2015 compliant * fix: remove invoke patch * fix: allow any line endings * chore: remove legacy bridge files * chore: latest assets * v0.18.15-pre * fix: remove unicode flag * chore: bump version * release v0.19.0
335 lines
8.5 KiB
Go
335 lines
8.5 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/leaanthony/mewn"
|
|
"github.com/leaanthony/slicer"
|
|
"github.com/leaanthony/spinner"
|
|
)
|
|
|
|
var fs = NewFSHelper()
|
|
|
|
// 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
|
|
}
|
|
|
|
// InstallGoDependencies will run go get in the current directory
|
|
func InstallGoDependencies() error {
|
|
depSpinner := spinner.New("Ensuring Dependencies are up to date...")
|
|
depSpinner.SetSpinSpeed(50)
|
|
depSpinner.Start()
|
|
err := NewProgramHelper().RunCommand("go get")
|
|
if err != nil {
|
|
depSpinner.Error()
|
|
return err
|
|
}
|
|
depSpinner.Success()
|
|
return nil
|
|
}
|
|
|
|
// BuildApplication will attempt to build the project based on the given inputs
|
|
func BuildApplication(binaryName string, forceRebuild bool, buildMode string, packageApp bool, projectOptions *ProjectOptions) error {
|
|
|
|
// Generate Windows assets if needed
|
|
if runtime.GOOS == "windows" {
|
|
cleanUp := !packageApp
|
|
err := NewPackageHelper().PackageWindows(projectOptions, cleanUp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Check Mewn is installed
|
|
err := CheckMewn()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
compileMessage := "Packing + Compiling project"
|
|
|
|
if buildMode == BuildModeDebug {
|
|
compileMessage += " (Debug Mode)"
|
|
}
|
|
|
|
packSpinner := spinner.New(compileMessage + "...")
|
|
packSpinner.SetSpinSpeed(50)
|
|
packSpinner.Start()
|
|
|
|
buildCommand := slicer.String()
|
|
buildCommand.Add("mewn")
|
|
|
|
if buildMode == BuildModeBridge {
|
|
// Ignore errors
|
|
buildCommand.Add("-i")
|
|
}
|
|
|
|
buildCommand.Add("build")
|
|
|
|
if binaryName != "" {
|
|
// Alter binary name based on OS
|
|
switch runtime.GOOS {
|
|
case "windows":
|
|
if !strings.HasSuffix(binaryName, ".exe") {
|
|
binaryName += ".exe"
|
|
}
|
|
default:
|
|
if strings.HasSuffix(binaryName, ".exe") {
|
|
binaryName = strings.TrimSuffix(binaryName, ".exe")
|
|
}
|
|
}
|
|
buildCommand.Add("-o")
|
|
buildCommand.Add(binaryName)
|
|
}
|
|
|
|
// If we are forcing a rebuild
|
|
if forceRebuild {
|
|
buildCommand.Add("-a")
|
|
}
|
|
|
|
// Setup ld flags
|
|
ldflags := "-w -s "
|
|
if buildMode == BuildModeDebug {
|
|
ldflags = ""
|
|
}
|
|
|
|
// Add windows flags
|
|
if runtime.GOOS == "windows" && buildMode == BuildModeProd {
|
|
ldflags += "-H windowsgui "
|
|
}
|
|
|
|
ldflags += "-X github.com/wailsapp/wails.BuildMode=" + buildMode
|
|
|
|
buildCommand.AddSlice([]string{"-ldflags", ldflags})
|
|
err = NewProgramHelper().RunCommandArray(buildCommand.AsSlice())
|
|
if err != nil {
|
|
packSpinner.Error()
|
|
return err
|
|
}
|
|
packSpinner.Success()
|
|
|
|
// packageApp
|
|
if packageApp {
|
|
err = PackageApplication(projectOptions)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// PackageApplication will attempt to package the application in a platform dependent way
|
|
func PackageApplication(projectOptions *ProjectOptions) error {
|
|
// Package app
|
|
message := "Generating .app"
|
|
if runtime.GOOS == "windows" {
|
|
err := CheckWindres()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
message = "Generating resource bundle"
|
|
}
|
|
packageSpinner := spinner.New(message)
|
|
packageSpinner.SetSpinSpeed(50)
|
|
packageSpinner.Start()
|
|
err := NewPackageHelper().Package(projectOptions)
|
|
if err != nil {
|
|
packageSpinner.Error()
|
|
return err
|
|
}
|
|
packageSpinner.Success()
|
|
return nil
|
|
}
|
|
|
|
// BuildFrontend runs the given build command
|
|
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
|
|
}
|
|
|
|
// CheckMewn checks if mewn is installed and if not, attempts to fetch it
|
|
func CheckMewn() (err error) {
|
|
programHelper := NewProgramHelper()
|
|
if !programHelper.IsInstalled("mewn") {
|
|
buildSpinner := spinner.New()
|
|
buildSpinner.SetSpinSpeed(50)
|
|
buildSpinner.Start("Installing Mewn asset packer...")
|
|
err := programHelper.InstallGoPackage("github.com/leaanthony/mewn/cmd/mewn")
|
|
if err != nil {
|
|
buildSpinner.Error()
|
|
return err
|
|
}
|
|
buildSpinner.Success()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CheckWindres checks if Windres is installed and if not, aborts
|
|
func CheckWindres() (err error) {
|
|
if runtime.GOOS != "windows" {
|
|
return nil
|
|
}
|
|
programHelper := NewProgramHelper()
|
|
if !programHelper.IsInstalled("windres") {
|
|
return fmt.Errorf("windres not installed. It comes by default with mingw. Ensure you have installed mingw correctly")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// InstallFrontendDeps attempts to install the frontend dependencies based on the given options
|
|
func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forceRebuild bool, caller string) 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("Ensuring frontend dependencies are up to date (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 node_modules does not exist, force a rebuild.
|
|
nodeModulesPath, err := filepath.Abs(filepath.Join(".", "node_modules"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !fs.DirExists(nodeModulesPath) {
|
|
forceRebuild = true
|
|
}
|
|
|
|
// 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)
|
|
}
|
|
|
|
// Install the runtime
|
|
err = InstallRuntime(caller, projectDir, projectOptions)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Build frontend
|
|
err = BuildFrontend(projectOptions.FrontEnd.Build)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// InstallRuntime installs the correct runtime for the type of build
|
|
func InstallRuntime(caller string, projectDir string, projectOptions *ProjectOptions) error {
|
|
if caller == "build" {
|
|
return InstallProdRuntime(projectDir, projectOptions)
|
|
}
|
|
|
|
return InstallBridge(projectDir, projectOptions)
|
|
}
|
|
|
|
// InstallBridge installs the relevant bridge javascript library
|
|
func InstallBridge(projectDir string, projectOptions *ProjectOptions) error {
|
|
bridgeFileData := mewn.String("../runtime/assets/bridge.js")
|
|
bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, "node_modules", "@wailsapp", "runtime", "init.js")
|
|
err := fs.CreateFile(bridgeFileTarget, []byte(bridgeFileData))
|
|
return err
|
|
}
|
|
|
|
// InstallProdRuntime installs the production runtime
|
|
func InstallProdRuntime(projectDir string, projectOptions *ProjectOptions) error {
|
|
prodInit := mewn.String("../runtime/js/runtime/init.js")
|
|
bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, "node_modules", "@wailsapp", "runtime", "init.js")
|
|
err := fs.CreateFile(bridgeFileTarget, []byte(prodInit))
|
|
return err
|
|
}
|
|
|
|
// ServeProject attempts to serve up the current project so that it may be connected to
|
|
// via the Wails bridge
|
|
func ServeProject(projectOptions *ProjectOptions, logger *Logger) error {
|
|
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 <<<<<")
|
|
}()
|
|
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()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|