diff --git a/v2/cmd/wails/internal/commands/build/build.go b/v2/cmd/wails/internal/commands/build/build.go index affb86db..fbadf6ff 100644 --- a/v2/cmd/wails/internal/commands/build/build.go +++ b/v2/cmd/wails/internal/commands/build/build.go @@ -6,7 +6,6 @@ import ( "io" "os" "os/exec" - "path/filepath" "runtime" "strings" "text/tabwriter" @@ -16,9 +15,6 @@ import ( "github.com/wailsapp/wails/v2/internal/project" "github.com/wailsapp/wails/v2/internal/system" - "github.com/wailsapp/wails/v2/cmd/wails/internal" - "github.com/wailsapp/wails/v2/internal/gomod" - "github.com/leaanthony/clir" "github.com/leaanthony/slicer" "github.com/wailsapp/wails/v2/pkg/clilogger" @@ -94,8 +90,8 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) { forceBuild := false command.BoolFlag("f", "Force build application", &forceBuild) - updateGoMod := false - command.BoolFlag("u", "Updates go.mod to use the same Wails version as the CLI", &updateGoMod) + updateGoModWailsVersion := false + command.BoolFlag("u", "Updates go.mod to use the same Wails version as the CLI", &updateGoModWailsVersion) debug := false command.BoolFlag("debug", "Retains debug data in the compiled application", &debug) @@ -249,7 +245,8 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) { return err } } - err = checkGoModVersion(logger, updateGoMod) + + err = SyncGoMod(logger, updateGoModWailsVersion) if err != nil { return err } @@ -395,58 +392,7 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) { }) } -func checkGoModVersion(logger *clilogger.CLILogger, updateGoMod bool) error { - cwd, err := os.Getwd() - if err != nil { - return err - } - gomodFilename := filepath.Join(cwd, "go.mod") - gomodData, err := os.ReadFile(gomodFilename) - if err != nil { - return err - } - outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version) - if err != nil { - return err - } - if !outOfSync { - return nil - } - gomodversion, err := gomod.GetWailsVersionFromModFile(gomodData) - if err != nil { - return err - } - - if updateGoMod { - return syncGoModVersion(cwd) - } - - logger.Println("Warning: go.mod is using Wails '%s' but the CLI is '%s'. Consider updating your project's `go.mod` file.\n", gomodversion.String(), internal.Version) - return nil -} - func LogGreen(message string, args ...interface{}) { text := fmt.Sprintf(message, args...) println(colour.Green(text)) } - -func syncGoModVersion(cwd string) error { - gomodFilename := filepath.Join(cwd, "go.mod") - gomodData, err := os.ReadFile(gomodFilename) - if err != nil { - return err - } - outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version) - if err != nil { - return err - } - if !outOfSync { - return nil - } - LogGreen("Updating go.mod to use Wails '%s'", internal.Version) - newGoData, err := gomod.UpdateGoModVersion(gomodData, internal.Version) - if err != nil { - return err - } - return os.WriteFile(gomodFilename, newGoData, 0755) -} diff --git a/v2/cmd/wails/internal/commands/build/gomod.go b/v2/cmd/wails/internal/commands/build/gomod.go new file mode 100644 index 00000000..19eefd7c --- /dev/null +++ b/v2/cmd/wails/internal/commands/build/gomod.go @@ -0,0 +1,56 @@ +package build + +import ( + "os" + "path/filepath" + + "github.com/wailsapp/wails/v2/cmd/wails/internal" + "github.com/wailsapp/wails/v2/internal/gomod" + "github.com/wailsapp/wails/v2/internal/goversion" + "github.com/wailsapp/wails/v2/pkg/clilogger" +) + +func SyncGoMod(logger *clilogger.CLILogger, updateWailsVersion bool) error { + cwd, err := os.Getwd() + if err != nil { + return err + } + gomodFilename := filepath.Join(cwd, "go.mod") + gomodData, err := os.ReadFile(gomodFilename) + if err != nil { + return err + } + + gomodData, updated, err := gomod.SyncGoVersion(gomodData, goversion.MinRequirement) + if err != nil { + return err + } else if updated { + LogGreen("Updated go.mod to use Go '%s'", goversion.MinRequirement) + } + + if outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version); err != nil { + return err + } else if outOfSync { + if updateWailsVersion { + LogGreen("Updating go.mod to use Wails '%s'", internal.Version) + gomodData, err = gomod.UpdateGoModVersion(gomodData, internal.Version) + if err != nil { + return err + } + updated = true + } else { + gomodversion, err := gomod.GetWailsVersionFromModFile(gomodData) + if err != nil { + return err + } + + logger.Println("Warning: go.mod is using Wails '%s' but the CLI is '%s'. Consider updating your project's `go.mod` file.\n", gomodversion.String(), internal.Version) + } + } + + if updated { + return os.WriteFile(gomodFilename, gomodData, 0755) + } + + return nil +} diff --git a/v2/cmd/wails/internal/commands/dev/dev.go b/v2/cmd/wails/internal/commands/dev/dev.go index d4852f46..82051d73 100644 --- a/v2/cmd/wails/internal/commands/dev/dev.go +++ b/v2/cmd/wails/internal/commands/dev/dev.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/wailsapp/wails/v2/pkg/commands/bindings" - "github.com/wailsapp/wails/v2/pkg/commands/buildtags" "io" "net" "net/http" @@ -22,9 +20,11 @@ import ( "syscall" "time" + "github.com/wailsapp/wails/v2/pkg/commands/bindings" + "github.com/wailsapp/wails/v2/pkg/commands/buildtags" + "github.com/google/shlex" - "github.com/wailsapp/wails/v2/cmd/wails/internal" - "github.com/wailsapp/wails/v2/internal/gomod" + buildcmd "github.com/wailsapp/wails/v2/cmd/wails/internal/commands/build" "github.com/wailsapp/wails/v2/internal/project" @@ -148,7 +148,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { } // Update go.mod to use current wails version - err = syncGoModVersion(cwd) + err = buildcmd.SyncGoMod(logger, true) if err != nil { return err } @@ -299,27 +299,6 @@ func killProcessAndCleanupBinary(process *process.Process, binary string) error return nil } -func syncGoModVersion(cwd string) error { - gomodFilename := filepath.Join(cwd, "go.mod") - gomodData, err := os.ReadFile(gomodFilename) - if err != nil { - return err - } - outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version) - if err != nil { - return err - } - if !outOfSync { - return nil - } - LogGreen("Updating go.mod to use Wails '%s'", internal.Version) - newGoData, err := gomod.UpdateGoModVersion(gomodData, internal.Version) - if err != nil { - return err - } - return os.WriteFile(gomodFilename, newGoData, 0755) -} - func runCommand(dir string, exitOnError bool, command string, args ...string) error { LogGreen("Executing: " + command + " " + strings.Join(args, " ")) cmd := exec.Command(command, args...) diff --git a/v2/internal/gomod/gomod.go b/v2/internal/gomod/gomod.go index 9fec4d01..c38e60f0 100644 --- a/v2/internal/gomod/gomod.go +++ b/v2/internal/gomod/gomod.go @@ -82,3 +82,33 @@ func UpdateGoModVersion(goModText []byte, currentVersion string) ([]byte, error) return file.Format() } + +func SyncGoVersion(goModText []byte, goVersion string) ([]byte, bool, error) { + file, err := modfile.Parse("", goModText, nil) + if err != nil { + return nil, false, err + } + + modVersion, err := semver.NewVersion(file.Go.Version) + if err != nil { + return nil, false, fmt.Errorf("Unable to parse Go version from go mod file: %s", err) + } + + targetVersion, err := semver.NewVersion(goVersion) + if err != nil { + return nil, false, fmt.Errorf("Unable to parse Go version: %s", targetVersion) + } + + if !targetVersion.GreaterThan(modVersion) { + return goModText, false, nil + } + + file.Go.Version = goVersion + file.Go.Syntax.Token[1] = goVersion + goModText, err = file.Format() + if err != nil { + return nil, false, err + } + + return goModText, true, nil +} diff --git a/v2/internal/gomod/gomod_test.go b/v2/internal/gomod/gomod_test.go index 43907c4a..2e47c783 100644 --- a/v2/internal/gomod/gomod_test.go +++ b/v2/internal/gomod/gomod_test.go @@ -589,3 +589,59 @@ replace ( github.com/wailsapp/wails/v2 v2.0.0-beta.20 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2 ) ` + +const basicGo117 string = `module changeme + +go 1.17 + +require github.com/wailsapp/wails/v2 v2.0.0-beta.7 + +` + +const basicGo118 string = `module changeme + +go 1.18 + +require github.com/wailsapp/wails/v2 v2.0.0-beta.7 +` + +const basicGo119 string = `module changeme + +go 1.19 + +require github.com/wailsapp/wails/v2 v2.0.0-beta.7 +` + +func TestUpdateGoModGoVersion(t *testing.T) { + is2 := is.New(t) + + type args struct { + goModText []byte + currentVersion string + } + tests := []struct { + name string + args args + want []byte + updated bool + }{ + {"basic1.17", args{[]byte(basicGo117), "1.18"}, []byte(basicGo118), true}, + {"basic1.18", args{[]byte(basicGo118), "1.18"}, []byte(basicGo118), false}, + {"basic1.19", args{[]byte(basicGo119), "1.17"}, []byte(basicGo119), false}, + {"basic1.19", args{[]byte(basicGo119), "1.18"}, []byte(basicGo119), false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, updated, err := SyncGoVersion(tt.args.goModText, tt.args.currentVersion) + if err != nil { + t.Errorf("UpdateGoModVersion() error = %v", err) + return + } + if updated != tt.updated { + t.Errorf("UpdateGoModVersion() updated = %t, want = %t", updated, tt.updated) + return + } + is2.Equal(got, tt.want) + }) + } +} diff --git a/v2/internal/goversion/build_constraint.go b/v2/internal/goversion/build_constraint.go new file mode 100644 index 00000000..5e1b9fcf --- /dev/null +++ b/v2/internal/goversion/build_constraint.go @@ -0,0 +1,10 @@ +//go:build !go1.18 +// +build !go1.18 + +package goversion + +const MinGoVersionRequired = "You need Go " + MinRequirement + " or newer to compile this program" + +func init() { + MinGoVersionRequired +} diff --git a/v2/internal/goversion/min.go b/v2/internal/goversion/min.go new file mode 100644 index 00000000..17edc0c9 --- /dev/null +++ b/v2/internal/goversion/min.go @@ -0,0 +1,3 @@ +package goversion + +const MinRequirement string = "1.18" diff --git a/v2/wails.go b/v2/wails.go index dc125f58..dec83b81 100644 --- a/v2/wails.go +++ b/v2/wails.go @@ -4,6 +4,7 @@ package wails import ( "github.com/wailsapp/wails/v2/internal/app" + _ "github.com/wailsapp/wails/v2/internal/goversion" // Add Compile-Time version check for minimum go version "github.com/wailsapp/wails/v2/internal/signal" "github.com/wailsapp/wails/v2/pkg/options" )