fix🐛: report failures from app and migrate -g file generation

Both commands discarded genFile's error, and genFile discarded the
errors from rendering its templates and from pkg.FileCreate. A file
that could not be written ended the process from inside FileCreate;
with core v2.11.0 it would have been reported as success instead.

genFile now returns every error, and both commands print it and exit
non-zero. In `app`, a missing router template no longer panics on a
nil template, and neither file is written unless both render.
This commit is contained in:
zhangwenjian
2026-09-27 14:01:48 +08:00
parent d89e0cd8eb
commit 6d06241e0d
3 changed files with 79 additions and 13 deletions
+18 -6
View File
@@ -7,6 +7,7 @@ import (
"github.com/go-admin-team/go-admin-core/v2/sdk/pkg"
"github.com/go-admin-team/go-admin-core/v2/sdk/pkg/utils"
"github.com/spf13/cobra"
"os"
"text/template"
)
@@ -33,7 +34,10 @@ func run() {
//1. 读取配置
fmt.Println(`generate migration file`)
_ = genFile()
if err := genFile(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
@@ -80,11 +84,19 @@ func genFile() error {
m := map[string]string{}
m["appName"] = appName
var b1 bytes.Buffer
err = t1.Execute(&b1, m)
pkg.FileCreate(b1, "./cmd/api/"+appName+".go")
if err = t1.Execute(&b1, m); err != nil {
return err
}
t2, err := template.ParseFiles("template/router.template")
if err != nil {
return err
}
var b2 bytes.Buffer
err = t2.Execute(&b2, nil)
pkg.FileCreate(b2, appPath+"/router/router.go")
return nil
if err = t2.Execute(&b2, nil); err != nil {
return err
}
if err = pkg.FileCreate(b1, "./cmd/api/"+appName+".go"); err != nil {
return err
}
return pkg.FileCreate(b2, appPath+"/router/router.go")
}
+54
View File
@@ -0,0 +1,54 @@
package migrate
import (
"os"
"path/filepath"
"testing"
)
// chdirWithTemplates runs the test from an empty directory that has the
// repository's template/ directory in it, which is what genFile reads from
// the working directory.
func chdirWithTemplates(t *testing.T) string {
t.Helper()
tmpl, err := filepath.Abs(filepath.Join("..", "..", "template"))
if err != nil {
t.Fatal(err)
}
dir := t.TempDir()
if err := os.Symlink(tmpl, filepath.Join(dir, "template")); err != nil {
t.Fatal(err)
}
t.Chdir(dir)
return dir
}
func TestGenFileWritesTheMigration(t *testing.T) {
dir := chdirWithTemplates(t)
out := filepath.Join(dir, "cmd", "migrate", "migration", "version-local")
if err := os.MkdirAll(out, 0o755); err != nil {
t.Fatal(err)
}
if err := genFile(); err != nil {
t.Fatalf("genFile: %v", err)
}
files, err := filepath.Glob(filepath.Join(out, "*_migrate.go"))
if err != nil {
t.Fatal(err)
}
if len(files) != 1 {
t.Fatalf("generated files = %v, want one", files)
}
}
// Run from a directory without cmd/migrate/migration, writing the file fails.
// The failure used to end the process from inside pkg.FileCreate and, before
// that, was dropped by genFile's caller; it now reaches the caller.
func TestGenFileReportsAFileItCannotWrite(t *testing.T) {
chdirWithTemplates(t)
if err := genFile(); err == nil {
t.Fatal("genFile returned nil with no directory to write into")
}
}
+7 -7
View File
@@ -106,7 +106,7 @@ func run() {
)
} else {
fmt.Println(`generate migration file`)
_ = genFile()
exitOnError(os.Stderr, genFile())
}
}
@@ -360,11 +360,11 @@ func genFile() error {
m["Package"] = "version"
}
var b1 bytes.Buffer
err = t1.Execute(&b1, m)
if goAdmin {
pkg.FileCreate(b1, "./cmd/migrate/migration/version/"+m["GenerateTime"]+"_migrate.go")
} else {
pkg.FileCreate(b1, "./cmd/migrate/migration/version-local/"+m["GenerateTime"]+"_migrate.go")
if err = t1.Execute(&b1, m); err != nil {
return err
}
return nil
if goAdmin {
return pkg.FileCreate(b1, "./cmd/migrate/migration/version/"+m["GenerateTime"]+"_migrate.go")
}
return pkg.FileCreate(b1, "./cmd/migrate/migration/version-local/"+m["GenerateTime"]+"_migrate.go")
}