5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 22:13:36 +08:00

[cli] Add check for minimum required go version (#1853)

- Update out of sync go.mod with minimum go version
- Check for minimum go version during build with build constraint
  “internal/goversion/build_constraint.go:9:2: MinGoVersionRequired (constant "You need Go 1.18 or newer to compile this program" of type string) is not used”
This commit is contained in:
stffabi 2022-09-14 23:28:28 +02:00 committed by GitHub
parent 854bd9433d
commit f1dc9eb4ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 165 additions and 84 deletions

View File

@ -6,7 +6,6 @@ import (
"io" "io"
"os" "os"
"os/exec" "os/exec"
"path/filepath"
"runtime" "runtime"
"strings" "strings"
"text/tabwriter" "text/tabwriter"
@ -16,9 +15,6 @@ import (
"github.com/wailsapp/wails/v2/internal/project" "github.com/wailsapp/wails/v2/internal/project"
"github.com/wailsapp/wails/v2/internal/system" "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/clir"
"github.com/leaanthony/slicer" "github.com/leaanthony/slicer"
"github.com/wailsapp/wails/v2/pkg/clilogger" "github.com/wailsapp/wails/v2/pkg/clilogger"
@ -94,8 +90,8 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
forceBuild := false forceBuild := false
command.BoolFlag("f", "Force build application", &forceBuild) command.BoolFlag("f", "Force build application", &forceBuild)
updateGoMod := false updateGoModWailsVersion := false
command.BoolFlag("u", "Updates go.mod to use the same Wails version as the CLI", &updateGoMod) command.BoolFlag("u", "Updates go.mod to use the same Wails version as the CLI", &updateGoModWailsVersion)
debug := false debug := false
command.BoolFlag("debug", "Retains debug data in the compiled application", &debug) 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 return err
} }
} }
err = checkGoModVersion(logger, updateGoMod)
err = SyncGoMod(logger, updateGoModWailsVersion)
if err != nil { if err != nil {
return err 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{}) { func LogGreen(message string, args ...interface{}) {
text := fmt.Sprintf(message, args...) text := fmt.Sprintf(message, args...)
println(colour.Green(text)) 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)
}

View File

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

View File

@ -4,8 +4,6 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/wailsapp/wails/v2/pkg/commands/bindings"
"github.com/wailsapp/wails/v2/pkg/commands/buildtags"
"io" "io"
"net" "net"
"net/http" "net/http"
@ -22,9 +20,11 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/wailsapp/wails/v2/pkg/commands/bindings"
"github.com/wailsapp/wails/v2/pkg/commands/buildtags"
"github.com/google/shlex" "github.com/google/shlex"
"github.com/wailsapp/wails/v2/cmd/wails/internal" buildcmd "github.com/wailsapp/wails/v2/cmd/wails/internal/commands/build"
"github.com/wailsapp/wails/v2/internal/gomod"
"github.com/wailsapp/wails/v2/internal/project" "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 // Update go.mod to use current wails version
err = syncGoModVersion(cwd) err = buildcmd.SyncGoMod(logger, true)
if err != nil { if err != nil {
return err return err
} }
@ -299,27 +299,6 @@ func killProcessAndCleanupBinary(process *process.Process, binary string) error
return nil 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 { func runCommand(dir string, exitOnError bool, command string, args ...string) error {
LogGreen("Executing: " + command + " " + strings.Join(args, " ")) LogGreen("Executing: " + command + " " + strings.Join(args, " "))
cmd := exec.Command(command, args...) cmd := exec.Command(command, args...)

View File

@ -82,3 +82,33 @@ func UpdateGoModVersion(goModText []byte, currentVersion string) ([]byte, error)
return file.Format() 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
}

View File

@ -589,3 +589,59 @@ replace (
github.com/wailsapp/wails/v2 v2.0.0-beta.20 => C:\Users\leaan\Documents\wails-v2-beta\wails\v2 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)
})
}
}

View File

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

View File

@ -0,0 +1,3 @@
package goversion
const MinRequirement string = "1.18"

View File

@ -4,6 +4,7 @@ package wails
import ( import (
"github.com/wailsapp/wails/v2/internal/app" "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/internal/signal"
"github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options"
) )