/
generate.go
91 lines (85 loc) · 2.57 KB
/
generate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package cmd
import (
"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
gen2 "github.com/agui2200/wingman-store/gen"
"github.com/agui2200/wingman-store/config"
"github.com/spf13/cobra"
"golang.org/x/tools/go/packages"
"log"
"os"
"path"
"strings"
)
func GenerateCommand() *cobra.Command {
var cfile string
var Generate = &cobra.Command{
Use: "generate <path>",
Example: examples(
"store generate",
),
Run: func(cmd *cobra.Command, args []string) {
var genTarget string
var targetPath string
// 检查文件是否存在
_, err := os.Stat(cfile)
if err != nil {
log.Fatalf("config %s error: %+v", cfile, err)
}
if err := config.LoadConfig(cfile); err != nil {
log.Fatalf("config file load error: %v", err)
}
var featureLists []gen.Feature
if config.C.Feature.EntQL {
featureLists = append(featureLists, gen.FeatureEntQL)
}
if config.C.Feature.Privacy {
featureLists = append(featureLists, gen.FeaturePrivacy)
}
if config.C.Feature.SchemaConfig {
featureLists = append(featureLists, gen.FeatureSchemaConfig)
}
if config.C.Feature.Snapshot {
featureLists = append(featureLists, gen.FeatureSnapshot)
}
baseDir, _ := path.Split(cfile)
if !path.IsAbs(baseDir) {
genTarget = "./" + path.Join(baseDir, config.C.SchemaPackage)
targetPath = "./" + path.Join(baseDir, config.C.TargetPackage)
} else {
genTarget = path.Join(baseDir, config.C.SchemaPackage)
targetPath = path.Join(baseDir, config.C.TargetPackage)
}
// 拼接path
pkgs, err := packages.Load(&packages.Config{
Mode: packages.NeedName | packages.NeedTypes | packages.NeedTypesInfo,
}, genTarget)
if err != nil {
log.Fatalf("load schema package error: %+v", err)
}
if len(pkgs) == 0 {
log.Fatalf("unknown %s package ", config.C.SchemaPackage)
}
log.Printf("load schema package: %s", genTarget)
// 解析出应该输出的package
pi := strings.Split(pkgs[0].String(), "/")
npack := path.Join(path.Join(pi[:len(pi)-1]...), config.C.TargetPackage)
err = entc.Generate(genTarget, &gen.Config{
Features: featureLists,
Header: "// Code generated by wingman-store, DO NOT EDIT.",
Package: npack,
Target: targetPath,
})
if err != nil {
log.Fatalf("running ent codegen: %v", err)
}
err = gen2.Generate(genTarget, targetPath, npack, cfile)
if err != nil {
log.Fatalf("code generate error: %+v", err)
}
log.Printf("generate package %s done", npack)
},
}
Generate.Flags().StringVarP(&cfile, "config", "c", defaultConfigFile, "load config file")
return Generate
}