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:
parent
854bd9433d
commit
f1dc9eb4ef
@ -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)
|
|
||||||
}
|
|
||||||
|
56
v2/cmd/wails/internal/commands/build/gomod.go
Normal file
56
v2/cmd/wails/internal/commands/build/gomod.go
Normal 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
|
||||||
|
}
|
@ -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...)
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
10
v2/internal/goversion/build_constraint.go
Normal file
10
v2/internal/goversion/build_constraint.go
Normal 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
|
||||||
|
}
|
3
v2/internal/goversion/min.go
Normal file
3
v2/internal/goversion/min.go
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
package goversion
|
||||||
|
|
||||||
|
const MinRequirement string = "1.18"
|
@ -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"
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user