From 13298635595ae16b318015b005e1af91c03a3571 Mon Sep 17 00:00:00 2001 From: ranxx Date: Fri, 17 Sep 2021 14:27:58 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Add=20recursion=20fl?= =?UTF-8?q?ag=20to=20the=20gen=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it can generate wire_gen.go directories recursively --- cmd/wire/main.go | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/cmd/wire/main.go b/cmd/wire/main.go index fa37e51d..ff95fe6d 100644 --- a/cmd/wire/main.go +++ b/cmd/wire/main.go @@ -101,6 +101,7 @@ type genCmd struct { headerFile string prefixFileName string tags string + recursion bool } func (*genCmd) Name() string { return "gen" } @@ -119,6 +120,38 @@ func (cmd *genCmd) SetFlags(f *flag.FlagSet) { f.StringVar(&cmd.headerFile, "header_file", "", "path to file to insert as a header in wire_gen.go") f.StringVar(&cmd.prefixFileName, "output_file_prefix", "", "string to prepend to output file names.") f.StringVar(&cmd.tags, "tags", "", "append build tags to the default wirebuild") + f.BoolVar(&cmd.recursion, "recursion", false, "gen creates the wire_gen.go file for all sub [packages].") +} + +func (cmd *genCmd) findAllSubDir(dirs []string) ([]string, error) { + retDirs := make([]string, len(dirs), len(dirs)*5) + copy(retDirs, dirs) + for index := 0; index < len(retDirs); index++ { + dir, err := os.Open(retDirs[index]) + if err != nil { + return nil, err + } + stat, err := dir.Stat() + if err != nil { + return nil, err + } + if !stat.IsDir() { + continue + } + subdirs, err := dir.ReadDir(0) + if err != nil { + panic(err) + } + + dirName := strings.TrimSuffix(retDirs[index], "/") + "/" + for _, v := range subdirs { + if !v.IsDir() { + continue + } + retDirs = append(retDirs, dirName+v.Name()) + } + } + return retDirs, nil } func (cmd *genCmd) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus { @@ -136,7 +169,18 @@ func (cmd *genCmd) Execute(ctx context.Context, f *flag.FlagSet, args ...interfa opts.PrefixOutputFile = cmd.prefixFileName opts.Tags = cmd.tags - outs, errs := wire.Generate(ctx, wd, os.Environ(), packages(f), opts) + // 递归所有目录 + patterns, err := packages(f), (error)(nil) + if cmd.recursion { + patterns, err = cmd.findAllSubDir(patterns) + } + + if err != nil { + log.Println(err) + return subcommands.ExitFailure + } + + outs, errs := wire.Generate(ctx, wd, os.Environ(), patterns, opts) if len(errs) > 0 { logErrors(errs) log.Println("generate failed") From 5140a3f9007b7b101cb3c0dfd358cdabe6cd382c Mon Sep 17 00:00:00 2001 From: ranxx Date: Fri, 17 Sep 2021 17:27:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=F0=9F=90=9B=20empty=20dir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/wire/main.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cmd/wire/main.go b/cmd/wire/main.go index ff95fe6d..30433710 100644 --- a/cmd/wire/main.go +++ b/cmd/wire/main.go @@ -124,8 +124,9 @@ func (cmd *genCmd) SetFlags(f *flag.FlagSet) { } func (cmd *genCmd) findAllSubDir(dirs []string) ([]string, error) { - retDirs := make([]string, len(dirs), len(dirs)*5) + retDirs := make([]string, len(dirs), len(dirs)*1024) copy(retDirs, dirs) + realDirs := make([]string, 0, len(dirs)*1024) for index := 0; index < len(retDirs); index++ { dir, err := os.Open(retDirs[index]) if err != nil { @@ -136,22 +137,30 @@ func (cmd *genCmd) findAllSubDir(dirs []string) ([]string, error) { return nil, err } if !stat.IsDir() { + realDirs = append(realDirs, retDirs[index]) continue } + subdirs, err := dir.ReadDir(0) if err != nil { - panic(err) + return nil, err } dirName := strings.TrimSuffix(retDirs[index], "/") + "/" + hasFile := false for _, v := range subdirs { if !v.IsDir() { + hasFile = true continue } retDirs = append(retDirs, dirName+v.Name()) } + + if hasFile { + realDirs = append(realDirs, retDirs[index]) + } } - return retDirs, nil + return realDirs, nil } func (cmd *genCmd) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus {