mirror of
				https://github.com/beego/bee.git
				synced 2025-11-04 04:13:26 +00:00 
			
		
		
		
	Merge pull request #329 from amrfaissal/enhance-help-and-usage
Enhances the commands help and usage output
This commit is contained in:
		
							
								
								
									
										89
									
								
								apiapp.go
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								apiapp.go
									
									
									
									
									
								
							@@ -24,39 +24,34 @@ import (
 | 
			
		||||
var cmdApiapp = &Command{
 | 
			
		||||
	// CustomFlags: true,
 | 
			
		||||
	UsageLine: "api [appname]",
 | 
			
		||||
	Short:     "create an API beego application",
 | 
			
		||||
	Short:     "Creates a Beego API application",
 | 
			
		||||
	Long: `
 | 
			
		||||
Create an API beego application.
 | 
			
		||||
  The command 'api' creates a Beego API application.
 | 
			
		||||
 | 
			
		||||
bee api [appname] [-tables=""] [-driver=mysql] [-conn=root:@tcp(127.0.0.1:3306)/test]
 | 
			
		||||
    -tables: a list of table names separated by ',' (default is empty, indicating all tables)
 | 
			
		||||
    -driver: [mysql | postgres | sqlite] (default: mysql)
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is ''
 | 
			
		||||
             e.g. for mysql:    root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
             e.g. for postgres: postgres://postgres:postgres@127.0.0.1:5432/postgres
 | 
			
		||||
  {{"Example:"|bold}}
 | 
			
		||||
      $ bee api [appname] [-tables=""] [-driver=mysql] [-conn=root:@tcp(127.0.0.1:3306)/test]
 | 
			
		||||
 | 
			
		||||
If 'conn' argument is empty, bee api creates an example API application,
 | 
			
		||||
when 'conn' argument is provided, bee api generates an API application based
 | 
			
		||||
on the existing database.
 | 
			
		||||
  If 'conn' argument is empty, the command will generate an example API application. Otherwise the command
 | 
			
		||||
  will connect to your database and generate models based on the existing tables.
 | 
			
		||||
 | 
			
		||||
The command 'api' creates a folder named [appname] and inside the folder deploy
 | 
			
		||||
the following files/directories structure:
 | 
			
		||||
 | 
			
		||||
	├── conf
 | 
			
		||||
	│   └── app.conf
 | 
			
		||||
	├── controllers
 | 
			
		||||
	│   └── object.go
 | 
			
		||||
	│   └── user.go
 | 
			
		||||
	├── routers
 | 
			
		||||
	│   └── router.go
 | 
			
		||||
	├── tests
 | 
			
		||||
	│   └── default_test.go
 | 
			
		||||
	├── main.go
 | 
			
		||||
	└── models
 | 
			
		||||
	    └── object.go
 | 
			
		||||
	    └── user.go
 | 
			
		||||
  The command 'api' creates a folder named [appname] with the following structure:
 | 
			
		||||
 | 
			
		||||
	    ├── main.go
 | 
			
		||||
	    ├── {{"conf"|foldername}}
 | 
			
		||||
	    │     └── app.conf
 | 
			
		||||
	    ├── {{"controllers"|foldername}}
 | 
			
		||||
	    │     └── object.go
 | 
			
		||||
	    │     └── user.go
 | 
			
		||||
	    ├── {{"routers"|foldername}}
 | 
			
		||||
	    │     └── router.go
 | 
			
		||||
	    ├── {{"tests"|foldername}}
 | 
			
		||||
	    │     └── default_test.go
 | 
			
		||||
	    └── {{"models"|foldername}}
 | 
			
		||||
	          └── object.go
 | 
			
		||||
	          └── user.go
 | 
			
		||||
`,
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    createapi,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var apiconf = `appname = {{.Appname}}
 | 
			
		||||
@@ -537,15 +532,13 @@ func TestGet(t *testing.T) {
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdApiapp.Run = createapi
 | 
			
		||||
	cmdApiapp.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	cmdApiapp.Flag.Var(&tables, "tables", "specify tables to generate model")
 | 
			
		||||
	cmdApiapp.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.")
 | 
			
		||||
	cmdApiapp.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance")
 | 
			
		||||
	cmdApiapp.Flag.Var(&tables, "tables", "List of table names separated by a comma.")
 | 
			
		||||
	cmdApiapp.Flag.Var(&driver, "driver", "Database driver. Either mysql, postgres or sqlite.")
 | 
			
		||||
	cmdApiapp.Flag.Var(&conn, "conn", "Connection string used by the driver to connect to a database instance.")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createapi(cmd *Command, args []string) int {
 | 
			
		||||
	w := NewColorWriter(os.Stdout)
 | 
			
		||||
	output := cmd.Out()
 | 
			
		||||
 | 
			
		||||
	if len(args) < 1 {
 | 
			
		||||
		logger.Fatal("Argument [appname] is missing")
 | 
			
		||||
@@ -568,19 +561,19 @@ func createapi(cmd *Command, args []string) int {
 | 
			
		||||
	logger.Info("Creating API...")
 | 
			
		||||
 | 
			
		||||
	os.MkdirAll(apppath, 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath, "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath, "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "conf"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf"), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "controllers"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers"), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "tests"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "conf", "app.conf"),
 | 
			
		||||
		strings.Replace(apiconf, "{{.Appname}}", path.Base(args[0]), -1))
 | 
			
		||||
 | 
			
		||||
	if conn != "" {
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		maingoContent := strings.Replace(apiMainconngo, "{{.Appname}}", packpath, -1)
 | 
			
		||||
		maingoContent = strings.Replace(maingoContent, "{{.DriverName}}", string(driver), -1)
 | 
			
		||||
		if driver == "mysql" {
 | 
			
		||||
@@ -602,33 +595,33 @@ func createapi(cmd *Command, args []string) int {
 | 
			
		||||
		generateAppcode(string(driver), string(conn), "3", string(tables), apppath)
 | 
			
		||||
	} else {
 | 
			
		||||
		os.Mkdir(path.Join(apppath, "models"), 0755)
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models"), "\x1b[0m")
 | 
			
		||||
		os.Mkdir(path.Join(apppath, "routers"), 0755)
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "object.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "object.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "controllers", "object.go"),
 | 
			
		||||
			strings.Replace(apiControllers, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "user.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "user.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "controllers", "user.go"),
 | 
			
		||||
			strings.Replace(apiControllers2, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests", "default_test.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests", "default_test.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "tests", "default_test.go"),
 | 
			
		||||
			strings.Replace(apiTests, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers", "router.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers", "router.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "routers", "router.go"),
 | 
			
		||||
			strings.Replace(apirouter, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "object.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "object.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "models", "object.go"), apiModels)
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "user.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "user.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "models", "user.go"), apiModels2)
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "main.go"),
 | 
			
		||||
			strings.Replace(apiMaingo, "{{.Appname}}", packpath, -1))
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								bale.go
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								bale.go
									
									
									
									
									
								
							@@ -28,22 +28,17 @@ import (
 | 
			
		||||
 | 
			
		||||
var cmdBale = &Command{
 | 
			
		||||
	UsageLine: "bale",
 | 
			
		||||
	Short:     "packs non-Go files to Go source files",
 | 
			
		||||
	Long: `
 | 
			
		||||
Bale command compress all the static files in to a single binary file.
 | 
			
		||||
	Short:     "Transforms non-Go files to Go source files",
 | 
			
		||||
	Long: `Bale command compress all the static files in to a single binary file.
 | 
			
		||||
 | 
			
		||||
This is useful to not have to carry static files including js, css, images
 | 
			
		||||
and views when publishing a project.
 | 
			
		||||
 | 
			
		||||
auto-generate unpack function to main package then run it during the runtime.
 | 
			
		||||
This is mainly used for zealots who are requiring 100% Go code.
 | 
			
		||||
  This is useful to not have to carry static files including js, css, images and
 | 
			
		||||
  views when deploying a Web application.
 | 
			
		||||
 | 
			
		||||
  It will auto-generate an unpack function to the main package then run it during the runtime.
 | 
			
		||||
  This is mainly used for zealots who are requiring 100% Go code.
 | 
			
		||||
`,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdBale.Run = runBale
 | 
			
		||||
	cmdBale.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    runBale,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runBale(cmd *Command, args []string) int {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										121
									
								
								bee.go
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								bee.go
									
									
									
									
									
								
							@@ -18,11 +18,11 @@ package main
 | 
			
		||||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"text/template"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const version = "1.5.2"
 | 
			
		||||
@@ -41,10 +41,10 @@ type Command struct {
 | 
			
		||||
	UsageLine string
 | 
			
		||||
 | 
			
		||||
	// Short is the short description shown in the 'go help' output.
 | 
			
		||||
	Short template.HTML
 | 
			
		||||
	Short string
 | 
			
		||||
 | 
			
		||||
	// Long is the long message shown in the 'go help <this-command>' output.
 | 
			
		||||
	Long template.HTML
 | 
			
		||||
	Long string
 | 
			
		||||
 | 
			
		||||
	// Flag is a set of flags specific to this command.
 | 
			
		||||
	Flag flag.FlagSet
 | 
			
		||||
@@ -52,6 +52,9 @@ type Command struct {
 | 
			
		||||
	// CustomFlags indicates that the command will do its own
 | 
			
		||||
	// flag parsing.
 | 
			
		||||
	CustomFlags bool
 | 
			
		||||
 | 
			
		||||
	// output out writer if set in SetOutput(w)
 | 
			
		||||
	output *io.Writer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Name returns the command's name: the first word in the usage line.
 | 
			
		||||
@@ -64,10 +67,24 @@ func (c *Command) Name() string {
 | 
			
		||||
	return name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetOutput sets the destination for usage and error messages.
 | 
			
		||||
// If output is nil, os.Stderr is used.
 | 
			
		||||
func (c *Command) SetOutput(output io.Writer) {
 | 
			
		||||
	c.output = &output
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Out returns the out writer of the current command.
 | 
			
		||||
// If cmd.output is nil, os.Stderr is used.
 | 
			
		||||
func (c *Command) Out() io.Writer {
 | 
			
		||||
	if c.output != nil {
 | 
			
		||||
		return *c.output
 | 
			
		||||
	}
 | 
			
		||||
	return NewColorWriter(os.Stderr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Usage puts out the usage for the command.
 | 
			
		||||
func (c *Command) Usage() {
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "usage: %s\n\n", c.UsageLine)
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "%s\n", strings.TrimSpace(string(c.Long)))
 | 
			
		||||
	tmpl(cmdUsage, c)
 | 
			
		||||
	os.Exit(2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -77,7 +94,25 @@ func (c *Command) Runnable() bool {
 | 
			
		||||
	return c.Run != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var commands = []*Command{
 | 
			
		||||
func (c *Command) Options() map[string]string {
 | 
			
		||||
	options := make(map[string]string)
 | 
			
		||||
	c.Flag.VisitAll(func(f *flag.Flag) {
 | 
			
		||||
		defaultVal := f.DefValue
 | 
			
		||||
		if len(defaultVal) > 0 {
 | 
			
		||||
			if strings.Contains(defaultVal, ":") {
 | 
			
		||||
				// Truncate the flag's default value by appending '...' at the end
 | 
			
		||||
				options[f.Name+"="+strings.Split(defaultVal, ":")[0]+":..."] = f.Usage
 | 
			
		||||
			} else {
 | 
			
		||||
				options[f.Name+"="+defaultVal] = f.Usage
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			options[f.Name] = f.Usage
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	return options
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var availableCommands = []*Command{
 | 
			
		||||
	cmdNew,
 | 
			
		||||
	cmdRun,
 | 
			
		||||
	cmdPack,
 | 
			
		||||
@@ -103,6 +138,7 @@ func main() {
 | 
			
		||||
	log.SetFlags(0)
 | 
			
		||||
 | 
			
		||||
	args := flag.Args()
 | 
			
		||||
 | 
			
		||||
	if len(args) < 1 {
 | 
			
		||||
		usage()
 | 
			
		||||
	}
 | 
			
		||||
@@ -112,7 +148,7 @@ func main() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, cmd := range commands {
 | 
			
		||||
	for _, cmd := range availableCommands {
 | 
			
		||||
		if cmd.Name() == args[0] && cmd.Run != nil {
 | 
			
		||||
			cmd.Flag.Usage = func() { cmd.Usage() }
 | 
			
		||||
			if cmd.CustomFlags {
 | 
			
		||||
@@ -137,71 +173,76 @@ func main() {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "bee: unknown subcommand %q\nRun 'bee help' for usage.\n", args[0])
 | 
			
		||||
	os.Exit(2)
 | 
			
		||||
	printErrorAndExit("Unknown subcommand")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var usageTemplate = `Bee is a tool for managing beego framework.
 | 
			
		||||
var usageTemplate = `Bee is a Fast and Flexible tool for managing your Beego Web Application.
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
{{"USAGE" | headline}}
 | 
			
		||||
    {{"bee command [arguments]" | bold}}
 | 
			
		||||
 | 
			
		||||
	bee command [arguments]
 | 
			
		||||
 | 
			
		||||
The commands are:
 | 
			
		||||
{{"AVAILABLE COMMANDS" | headline}}
 | 
			
		||||
{{range .}}{{if .Runnable}}
 | 
			
		||||
    {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
 | 
			
		||||
    {{.Name | printf "%-11s" | bold}} {{.Short}}{{end}}{{end}}
 | 
			
		||||
 | 
			
		||||
Use "bee help [command]" for more information about a command.
 | 
			
		||||
Use {{"bee help [command]" | bold}} for more information about a command.
 | 
			
		||||
 | 
			
		||||
Additional help topics:
 | 
			
		||||
{{"ADDITIONAL HELP TOPICS" | headline}}
 | 
			
		||||
{{range .}}{{if not .Runnable}}
 | 
			
		||||
    {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
 | 
			
		||||
 | 
			
		||||
Use "bee help [topic]" for more information about that topic.
 | 
			
		||||
Use {{"bee help [topic]" | bold}} for more information about that topic.
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
var helpTemplate = `{{if .Runnable}}usage: bee {{.UsageLine}}
 | 
			
		||||
 | 
			
		||||
{{end}}{{.Long | trim}}
 | 
			
		||||
var helpTemplate = `{{"USAGE" | headline}}
 | 
			
		||||
  {{.UsageLine | printf "bee %s" | bold}}
 | 
			
		||||
{{if .Options}}{{endline}}{{"OPTIONS" | headline}}{{range $k,$v := .Options}}
 | 
			
		||||
  {{$k | printf "-%-12s" | bold}} {{$v}}{{end}}{{endline}}{{end}}
 | 
			
		||||
{{"DESCRIPTION" | headline}}
 | 
			
		||||
  {{tmpltostr .Long . | trim}}
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
var errorTemplate = `bee: %s.
 | 
			
		||||
Use {{"bee help" | bold}} for more information.
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
var cmdUsage = `Use {{printf "bee help %s" .Name | bold}} for more information.{{endline}}`
 | 
			
		||||
 | 
			
		||||
func usage() {
 | 
			
		||||
	tmpl(os.Stdout, usageTemplate, commands)
 | 
			
		||||
	tmpl(usageTemplate, availableCommands)
 | 
			
		||||
	os.Exit(2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tmpl(w io.Writer, text string, data interface{}) {
 | 
			
		||||
	t := template.New("top")
 | 
			
		||||
	t.Funcs(template.FuncMap{"trim": func(s template.HTML) template.HTML {
 | 
			
		||||
		return template.HTML(strings.TrimSpace(string(s)))
 | 
			
		||||
	}})
 | 
			
		||||
func tmpl(text string, data interface{}) {
 | 
			
		||||
	output := NewColorWriter(os.Stderr)
 | 
			
		||||
 | 
			
		||||
	t := template.New("usage").Funcs(BeeFuncMap())
 | 
			
		||||
	template.Must(t.Parse(text))
 | 
			
		||||
	if err := t.Execute(w, data); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := t.Execute(output, data)
 | 
			
		||||
	MustCheck(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func help(args []string) {
 | 
			
		||||
	if len(args) == 0 {
 | 
			
		||||
		usage()
 | 
			
		||||
		// not exit 2: succeeded at 'go help'.
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if len(args) != 1 {
 | 
			
		||||
		fmt.Fprintf(os.Stdout, "usage: bee help command\n\nToo many arguments given.\n")
 | 
			
		||||
		os.Exit(2) // failed at 'bee help'
 | 
			
		||||
		printErrorAndExit("Too many arguments")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	arg := args[0]
 | 
			
		||||
 | 
			
		||||
	for _, cmd := range commands {
 | 
			
		||||
	for _, cmd := range availableCommands {
 | 
			
		||||
		if cmd.Name() == arg {
 | 
			
		||||
			tmpl(os.Stdout, helpTemplate, cmd)
 | 
			
		||||
			// not exit 2: succeeded at 'go help cmd'.
 | 
			
		||||
			tmpl(helpTemplate, cmd)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(os.Stdout, "Unknown help topic %#q.  Run 'bee help'.\n", arg)
 | 
			
		||||
	os.Exit(2) // failed at 'bee help cmd'
 | 
			
		||||
	printErrorAndExit("Unknown help topic")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func printErrorAndExit(message string) {
 | 
			
		||||
	tmpl(fmt.Sprintf(errorTemplate, message), nil)
 | 
			
		||||
	os.Exit(2)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								fix.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								fix.go
									
									
									
									
									
								
							@@ -13,11 +13,11 @@ import (
 | 
			
		||||
 | 
			
		||||
var cmdFix = &Command{
 | 
			
		||||
	UsageLine: "fix",
 | 
			
		||||
	Short:     "fix the beego application to make it compatible with beego 1.6",
 | 
			
		||||
	Long: `
 | 
			
		||||
As from beego1.6, there's some incompatible code with the old version.
 | 
			
		||||
	Short:     "Fixes your application by making it compatible with newer versions of Beego",
 | 
			
		||||
	Long: `As of {{"Beego 1.6"|bold}}, there are some backward compatibility issues.
 | 
			
		||||
 | 
			
		||||
bee fix help to upgrade the application to beego 1.6
 | 
			
		||||
  The command 'fix' will try to solve those issues by upgrading your code base
 | 
			
		||||
  to be compatible  with Beego version 1.6+.
 | 
			
		||||
`,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -27,6 +27,8 @@ func init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runFix(cmd *Command, args []string) int {
 | 
			
		||||
	output := cmd.Out()
 | 
			
		||||
 | 
			
		||||
	logger.Info("Upgrading the application...")
 | 
			
		||||
 | 
			
		||||
	dir, err := os.Getwd()
 | 
			
		||||
@@ -48,13 +50,13 @@ func runFix(cmd *Command, args []string) int {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		err = fixFile(path)
 | 
			
		||||
		fmt.Println("\tfix\t", path)
 | 
			
		||||
		fmt.Fprintf(output, GreenBold("\tfix\t")+"%s\n", path)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logger.Errorf("Could not fix file: %s", err)
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	})
 | 
			
		||||
	logger.Success("Upgrade done!")
 | 
			
		||||
	logger.Success("Upgrade Done!")
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										71
									
								
								g.go
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								g.go
									
									
									
									
									
								
							@@ -20,45 +20,42 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var cmdGenerate = &Command{
 | 
			
		||||
	UsageLine: "generate [Command]",
 | 
			
		||||
	Short:     "source code generator",
 | 
			
		||||
	Long: `
 | 
			
		||||
bee generate scaffold [scaffoldname] [-fields=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
    The generate scaffold command will do a number of things for you.
 | 
			
		||||
    -fields: a list of table fields. Format: field:type, ...
 | 
			
		||||
    -driver: [mysql | postgres | sqlite], the default is mysql
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
    example: bee generate scaffold post -fields="title:string,body:text"
 | 
			
		||||
	UsageLine: "generate [command]",
 | 
			
		||||
	Short:     "Source code generator",
 | 
			
		||||
	Long: `▶ {{"To scaffold out your entire application:"|bold}}
 | 
			
		||||
 | 
			
		||||
bee generate model [modelname] [-fields=""]
 | 
			
		||||
    generate RESTFul model based on fields
 | 
			
		||||
    -fields: a list of table fields. Format: field:type, ...
 | 
			
		||||
     $ bee generate scaffold [scaffoldname] [-fields="title:string,body:text"] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
 | 
			
		||||
bee generate controller [controllerfile]
 | 
			
		||||
    generate RESTful controllers
 | 
			
		||||
  ▶ {{"To generate a Model based on fields:"|bold}}
 | 
			
		||||
 | 
			
		||||
bee generate view [viewpath]
 | 
			
		||||
    generate CRUD view in viewpath
 | 
			
		||||
     $ bee generate model [modelname] [-fields="name:type"]
 | 
			
		||||
 | 
			
		||||
bee generate migration [migrationfile] [-fields=""]
 | 
			
		||||
    generate migration file for making database schema update
 | 
			
		||||
    -fields: a list of table fields. Format: field:type, ...
 | 
			
		||||
  ▶ {{"To generate a controller:"|bold}}
 | 
			
		||||
 | 
			
		||||
bee generate docs
 | 
			
		||||
    generate swagger doc file
 | 
			
		||||
     $ bee generate controller [controllerfile]
 | 
			
		||||
 | 
			
		||||
bee generate test [routerfile]
 | 
			
		||||
    generate testcase
 | 
			
		||||
  ▶ {{"To generate a CRUD view:"|bold}}
 | 
			
		||||
 | 
			
		||||
bee generate appcode [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-level=3]
 | 
			
		||||
    generate appcode based on an existing database
 | 
			
		||||
    -tables: a list of table names separated by ',', default is empty, indicating all tables
 | 
			
		||||
    -driver: [mysql | postgres | sqlite], the default is mysql
 | 
			
		||||
    -conn:   the connection string used by the driver.
 | 
			
		||||
             default for mysql:    root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
             default for postgres: postgres://postgres:postgres@127.0.0.1:5432/postgres
 | 
			
		||||
    -level:  [1 | 2 | 3], 1 = models; 2 = models,controllers; 3 = models,controllers,router
 | 
			
		||||
     $ bee generate view [viewpath]
 | 
			
		||||
 | 
			
		||||
  ▶ {{"To generate a migration file for making database schema updates:"|bold}}
 | 
			
		||||
 | 
			
		||||
     $ bee generate migration [migrationfile] [-fields="name:type"]
 | 
			
		||||
 | 
			
		||||
  ▶ {{"To generate swagger doc file:"|bold}}
 | 
			
		||||
 | 
			
		||||
     $ bee generate docs
 | 
			
		||||
 | 
			
		||||
  ▶ {{"To generate a test case:"|bold}}
 | 
			
		||||
 | 
			
		||||
     $ bee generate test [routerfile]
 | 
			
		||||
 | 
			
		||||
  ▶ {{"To generate appcode based on an existing database:"|bold}}
 | 
			
		||||
 | 
			
		||||
     $ bee generate appcode [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-level=3]
 | 
			
		||||
`,
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    generateCode,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var driver docValue
 | 
			
		||||
@@ -68,13 +65,11 @@ var tables docValue
 | 
			
		||||
var fields docValue
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdGenerate.Run = generateCode
 | 
			
		||||
	cmdGenerate.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	cmdGenerate.Flag.Var(&tables, "tables", "specify tables to generate model")
 | 
			
		||||
	cmdGenerate.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.")
 | 
			
		||||
	cmdGenerate.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance")
 | 
			
		||||
	cmdGenerate.Flag.Var(&level, "level", "1 = models only; 2 = models and controllers; 3 = models, controllers and routers")
 | 
			
		||||
	cmdGenerate.Flag.Var(&fields, "fields", "specify the fields want to generate.")
 | 
			
		||||
	cmdGenerate.Flag.Var(&tables, "tables", "List of table names separated by a comma.")
 | 
			
		||||
	cmdGenerate.Flag.Var(&driver, "driver", "Database driver. Either mysql, postgres or sqlite.")
 | 
			
		||||
	cmdGenerate.Flag.Var(&conn, "conn", "Connection string used by the driver to connect to a database instance.")
 | 
			
		||||
	cmdGenerate.Flag.Var(&level, "level", "Either 1, 2 or 3. i.e. 1=models; 2=models and controllers; 3=models, controllers and routers.")
 | 
			
		||||
	cmdGenerate.Flag.Var(&fields, "fields", "List of table fields.")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func generateCode(cmd *Command, args []string) int {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										87
									
								
								hproseapp.go
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								hproseapp.go
									
									
									
									
									
								
							@@ -1,19 +1,16 @@
 | 
			
		||||
/**********************************************************\
 | 
			
		||||
|                                                          |
 | 
			
		||||
|                          hprose                          |
 | 
			
		||||
|                                                          |
 | 
			
		||||
| Official WebSite: http://www.hprose.com/                 |
 | 
			
		||||
|                   http://www.hprose.org/                 |
 | 
			
		||||
|                                                          |
 | 
			
		||||
\**********************************************************/
 | 
			
		||||
/**********************************************************\
 | 
			
		||||
 *                                                        *
 | 
			
		||||
 * Build rpc application use Hprose base on beego         *
 | 
			
		||||
 *                                                        *
 | 
			
		||||
 * LastModified: Oct 31, 2016                             *
 | 
			
		||||
 * Author: Liu jian <laoliu@lanmv.com>                    *
 | 
			
		||||
 *                                                        *
 | 
			
		||||
\**********************************************************/
 | 
			
		||||
// Copyright 2013 bee authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may
 | 
			
		||||
// not use this file except in compliance with the License. You may obtain
 | 
			
		||||
// a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
// License for the specific language governing permissions and limitations
 | 
			
		||||
// under the License.
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
@@ -27,30 +24,28 @@ import (
 | 
			
		||||
var cmdHproseapp = &Command{
 | 
			
		||||
	// CustomFlags: true,
 | 
			
		||||
	UsageLine: "hprose [appname]",
 | 
			
		||||
	Short:     "create an rpc application use hprose base on beego framework",
 | 
			
		||||
	Short:     "Creates an RPC application based on Hprose and Beego frameworks",
 | 
			
		||||
	Long: `
 | 
			
		||||
create an rpc application use hprose base on beego framework
 | 
			
		||||
  The command 'hprose' creates an RPC application based on both Beego and Hprose (http://hprose.com/).
 | 
			
		||||
 | 
			
		||||
bee hprose [appname] [-tables=""] [-driver=mysql] [-conn=root:@tcp(127.0.0.1:3306)/test]
 | 
			
		||||
    -tables: a list of table names separated by ',', default is empty, indicating all tables
 | 
			
		||||
    -driver: [mysql | postgres | sqlite], the default is mysql
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is ''
 | 
			
		||||
             e.g. for mysql:    root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
             e.g. for postgres: postgres://postgres:postgres@127.0.0.1:5432/postgres
 | 
			
		||||
  {{"To scaffold out your application, use:"|bold}}
 | 
			
		||||
 | 
			
		||||
if conn is empty will create a example rpc application. otherwise generate rpc application use hprose based on an existing database.
 | 
			
		||||
      $ bee hprose [appname] [-tables=""] [-driver=mysql] [-conn=root:@tcp(127.0.0.1:3306)/test]
 | 
			
		||||
 | 
			
		||||
In the current path, will create a folder named [appname]
 | 
			
		||||
  If 'conn' is empty, the command will generate a sample application. Otherwise the command
 | 
			
		||||
  will connect to your database and generate models based on the existing tables.
 | 
			
		||||
 | 
			
		||||
In the appname folder has the follow struct:
 | 
			
		||||
  The command 'hprose' creates a folder named [appname] with the following structure:
 | 
			
		||||
 | 
			
		||||
	├── conf
 | 
			
		||||
	│   └── app.conf
 | 
			
		||||
	├── main.go
 | 
			
		||||
	└── models
 | 
			
		||||
	    └── object.go
 | 
			
		||||
	    └── user.go
 | 
			
		||||
	    ├── main.go
 | 
			
		||||
	    ├── {{"conf"|foldername}}
 | 
			
		||||
	    │     └── app.conf
 | 
			
		||||
	    └── {{"models"|foldername}}
 | 
			
		||||
	          └── object.go
 | 
			
		||||
	          └── user.go
 | 
			
		||||
`,
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    createhprose,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var hproseconf = `appname = {{.Appname}}
 | 
			
		||||
@@ -297,15 +292,13 @@ func DeleteUser(uid string) {
 | 
			
		||||
var hproseAddFunctions = []string{}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdHproseapp.Run = createhprose
 | 
			
		||||
	cmdHproseapp.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	cmdHproseapp.Flag.Var(&tables, "tables", "specify tables to generate model")
 | 
			
		||||
	cmdHproseapp.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.")
 | 
			
		||||
	cmdHproseapp.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance")
 | 
			
		||||
	cmdHproseapp.Flag.Var(&tables, "tables", "List of table names separated by a comma.")
 | 
			
		||||
	cmdHproseapp.Flag.Var(&driver, "driver", "Database driver. Either mysql, postgres or sqlite.")
 | 
			
		||||
	cmdHproseapp.Flag.Var(&conn, "conn", "Connection string used by the driver to connect to a database instance.")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createhprose(cmd *Command, args []string) int {
 | 
			
		||||
	w := NewColorWriter(os.Stdout)
 | 
			
		||||
	output := cmd.Out()
 | 
			
		||||
 | 
			
		||||
	curpath, _ := os.Getwd()
 | 
			
		||||
	if len(args) > 1 {
 | 
			
		||||
@@ -324,10 +317,10 @@ func createhprose(cmd *Command, args []string) int {
 | 
			
		||||
	logger.Info("Creating Hprose application...")
 | 
			
		||||
 | 
			
		||||
	os.MkdirAll(apppath, 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath, "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath, "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "conf"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "conf", "app.conf"),
 | 
			
		||||
		strings.Replace(hproseconf, "{{.Appname}}", args[0], -1))
 | 
			
		||||
 | 
			
		||||
@@ -336,7 +329,7 @@ func createhprose(cmd *Command, args []string) int {
 | 
			
		||||
		logger.Infof("Using '%s' as 'conn'", conn)
 | 
			
		||||
		logger.Infof("Using '%s' as 'tables'", tables)
 | 
			
		||||
		generateHproseAppcode(string(driver), string(conn), "1", string(tables), path.Join(curpath, args[0]))
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		maingoContent := strings.Replace(hproseMainconngo, "{{.Appname}}", packpath, -1)
 | 
			
		||||
		maingoContent = strings.Replace(maingoContent, "{{.DriverName}}", string(driver), -1)
 | 
			
		||||
		maingoContent = strings.Replace(maingoContent, "{{HproseFunctionList}}", strings.Join(hproseAddFunctions, ""), -1)
 | 
			
		||||
@@ -355,15 +348,15 @@ func createhprose(cmd *Command, args []string) int {
 | 
			
		||||
		)
 | 
			
		||||
	} else {
 | 
			
		||||
		os.Mkdir(path.Join(apppath, "models"), 0755)
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models"), "\x1b[0m")
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "object.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "object.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "models", "object.go"), apiModels)
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "user.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models", "user.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "models", "user.go"), apiModels2)
 | 
			
		||||
 | 
			
		||||
		fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
		WriteToFile(path.Join(apppath, "main.go"),
 | 
			
		||||
			strings.Replace(hproseMaingo, "{{.Appname}}", packpath, -1))
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								migrate.go
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								migrate.go
									
									
									
									
									
								
							@@ -27,38 +27,35 @@ import (
 | 
			
		||||
 | 
			
		||||
var cmdMigrate = &Command{
 | 
			
		||||
	UsageLine: "migrate [Command]",
 | 
			
		||||
	Short:     "run database migrations",
 | 
			
		||||
	Long: `
 | 
			
		||||
bee migrate [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
    run all outstanding migrations
 | 
			
		||||
    -driver: [mysql | postgres | sqlite] (default: mysql)
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
	Short:     "Runs database migrations",
 | 
			
		||||
	Long: `The command 'migrate' allows you to run database migrations to keep it up-to-date.
 | 
			
		||||
 | 
			
		||||
bee migrate rollback [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
    rollback the last migration operation
 | 
			
		||||
    -driver: [mysql | postgres | sqlite] (default: mysql)
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
  ▶ {{"To run all the migrations:"|bold}}
 | 
			
		||||
 | 
			
		||||
bee migrate reset [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
    rollback all migrations
 | 
			
		||||
    -driver: [mysql | postgres | sqlite] (default: mysql)
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
    $ bee migrate [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
 | 
			
		||||
bee migrate refresh [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
    rollback all migrations and run them all again
 | 
			
		||||
    -driver: [mysql | postgres | sqlite] (default: mysql)
 | 
			
		||||
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
 | 
			
		||||
  ▶ {{"To rollback the last migration:"|bold}}
 | 
			
		||||
 | 
			
		||||
    $ bee migrate rollback [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
 | 
			
		||||
  ▶ {{"To do a reset, which will rollback all the migrations:"|bold}}
 | 
			
		||||
 | 
			
		||||
    $ bee migrate reset [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
 | 
			
		||||
  ▶ {{"To update your schema:"|bold}}
 | 
			
		||||
 | 
			
		||||
    $ bee migrate refresh [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
 | 
			
		||||
`,
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    runMigration,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var mDriver docValue
 | 
			
		||||
var mConn docValue
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdMigrate.Run = runMigration
 | 
			
		||||
	cmdMigrate.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	cmdMigrate.Flag.Var(&mDriver, "driver", "database driver: mysql, postgres, sqlite, etc.")
 | 
			
		||||
	cmdMigrate.Flag.Var(&mConn, "conn", "connection string used by the driver to connect to a database instance")
 | 
			
		||||
	cmdMigrate.Flag.Var(&mDriver, "driver", "Database driver. Either mysql, postgres or sqlite.")
 | 
			
		||||
	cmdMigrate.Flag.Var(&mConn, "conn", "Connection string used by the driver to connect to a database instance.")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// runMigration is the entry point for starting a migration
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										81
									
								
								new.go
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								new.go
									
									
									
									
									
								
							@@ -23,41 +23,36 @@ import (
 | 
			
		||||
 | 
			
		||||
var cmdNew = &Command{
 | 
			
		||||
	UsageLine: "new [appname]",
 | 
			
		||||
	Short:     "Create a Beego application",
 | 
			
		||||
	Short:     "Creates a Beego application",
 | 
			
		||||
	Long: `
 | 
			
		||||
Creates a Beego application for the given app name in the current directory.
 | 
			
		||||
 | 
			
		||||
The command 'new' creates a folder named [appname] and inside the folder deploy
 | 
			
		||||
the following files/directories structure:
 | 
			
		||||
  The command 'new' creates a folder named [appname] and generates the following structure:
 | 
			
		||||
 | 
			
		||||
    |- main.go
 | 
			
		||||
    |- conf
 | 
			
		||||
        |-  app.conf
 | 
			
		||||
    |- controllers
 | 
			
		||||
         |- default.go
 | 
			
		||||
    |- models
 | 
			
		||||
    |- routers
 | 
			
		||||
         |- router.go
 | 
			
		||||
    |- tests
 | 
			
		||||
         |- default_test.go
 | 
			
		||||
	|- static
 | 
			
		||||
         |- js
 | 
			
		||||
         |- css
 | 
			
		||||
         |- img
 | 
			
		||||
    |- views
 | 
			
		||||
        index.tpl
 | 
			
		||||
            ├── main.go
 | 
			
		||||
            ├── {{"conf"|foldername}}
 | 
			
		||||
            │     └── app.conf
 | 
			
		||||
            ├── {{"controllers"|foldername}}
 | 
			
		||||
            │     └── default.go
 | 
			
		||||
            ├── {{"models"|foldername}}
 | 
			
		||||
            ├── {{"routers"|foldername}}
 | 
			
		||||
            │     └── router.go
 | 
			
		||||
            ├── {{"tests"|foldername}}
 | 
			
		||||
            │     └── default_test.go
 | 
			
		||||
            ├── {{"static"|foldername}}
 | 
			
		||||
            │     └── {{"js"|foldername}}
 | 
			
		||||
            │     └── {{"css"|foldername}}
 | 
			
		||||
            │     └── {{"img"|foldername}}
 | 
			
		||||
            └── {{"views"|foldername}}
 | 
			
		||||
                  └── index.tpl
 | 
			
		||||
 | 
			
		||||
`,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdNew.Run = createApp
 | 
			
		||||
	cmdNew.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    createApp,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createApp(cmd *Command, args []string) int {
 | 
			
		||||
	w := NewColorWriter(os.Stdout)
 | 
			
		||||
 | 
			
		||||
	output := cmd.Out()
 | 
			
		||||
	if len(args) != 1 {
 | 
			
		||||
		logger.Fatal("Argument [appname] is missing")
 | 
			
		||||
	}
 | 
			
		||||
@@ -78,43 +73,43 @@ func createApp(cmd *Command, args []string) int {
 | 
			
		||||
	logger.Info("Creating application...")
 | 
			
		||||
 | 
			
		||||
	os.MkdirAll(apppath, 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "conf"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "controllers"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "models"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "routers"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "tests"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "static"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "static", "js"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "js")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "js")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "static", "css"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "css")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "css")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "static", "img"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "img")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "views")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "img")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "views")+string(path.Separator), "\x1b[0m")
 | 
			
		||||
	os.Mkdir(path.Join(apppath, "views"), 0755)
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "conf", "app.conf"), strings.Replace(appconf, "{{.Appname}}", path.Base(args[0]), -1))
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "default.go"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "default.go"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "controllers", "default.go"), controllers)
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "views", "index.tpl"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "views", "index.tpl"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "views", "index.tpl"), indextpl)
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers", "router.go"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers", "router.go"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "routers", "router.go"), strings.Replace(router, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests", "default_test.go"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests", "default_test.go"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "tests", "default_test.go"), strings.Replace(test, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
	fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
 | 
			
		||||
	WriteToFile(path.Join(apppath, "main.go"), strings.Replace(maingo, "{{.Appname}}", packpath, -1))
 | 
			
		||||
 | 
			
		||||
	logger.Success("New application successfully created!")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								pack.go
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								pack.go
									
									
									
									
									
								
							@@ -36,26 +36,15 @@ import (
 | 
			
		||||
var cmdPack = &Command{
 | 
			
		||||
	CustomFlags: true,
 | 
			
		||||
	UsageLine:   "pack",
 | 
			
		||||
	Short:       "Compress a beego project into a single file",
 | 
			
		||||
	Long: `
 | 
			
		||||
Pack is used to compress a beego project into a single file.
 | 
			
		||||
This eases the deployment by extracting the zip file to a server.
 | 
			
		||||
	Short:       "Compresses a Beego application into a single file",
 | 
			
		||||
	Long: `Pack is used to compress Beego applications into a tarball/zip file.
 | 
			
		||||
  This eases the deployment by directly extracting the file to a server.
 | 
			
		||||
 | 
			
		||||
-p            app path (default is the current path).
 | 
			
		||||
-b            build specify platform app (default: true).
 | 
			
		||||
-ba           additional args of go build
 | 
			
		||||
-be=[]        additional ENV Variables of go build. eg: GOARCH=arm
 | 
			
		||||
-o            compressed file output dir. default use current path
 | 
			
		||||
-f=""         format: tar.gz, zip (default: tar.gz)
 | 
			
		||||
-exp=""       relpath exclude prefix (default: .). use : as separator
 | 
			
		||||
-exs=""       relpath exclude suffix (default: .go:.DS_Store:.tmp). use : as separator
 | 
			
		||||
              all path use : as separator
 | 
			
		||||
-exr=[]       file/directory name exclude by Regexp (default: ^).
 | 
			
		||||
-fs=false     follow symlink (default: false).
 | 
			
		||||
-ss=false     skip symlink (default: false)
 | 
			
		||||
              default embed symlink into compressed file
 | 
			
		||||
-v=false      verbose
 | 
			
		||||
  {{"Example:"|bold}}
 | 
			
		||||
    $ bee pack -v -ba="-ldflags '-s -w'"
 | 
			
		||||
`,
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    packApp,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -71,7 +60,6 @@ var (
 | 
			
		||||
	buildEnvs ListOpts
 | 
			
		||||
	verbose   bool
 | 
			
		||||
	format    string
 | 
			
		||||
	w         io.Writer
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ListOpts []string
 | 
			
		||||
@@ -87,22 +75,19 @@ func (opts *ListOpts) Set(value string) error {
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	fs := flag.NewFlagSet("pack", flag.ContinueOnError)
 | 
			
		||||
	fs.StringVar(&appPath, "p", "", "app path. default is current path")
 | 
			
		||||
	fs.BoolVar(&build, "b", true, "build specify platform app")
 | 
			
		||||
	fs.StringVar(&buildArgs, "ba", "", "additional args of go build")
 | 
			
		||||
	fs.Var(&buildEnvs, "be", "additional ENV Variables of go build. eg: GOARCH=arm")
 | 
			
		||||
	fs.StringVar(&outputP, "o", "", "compressed file output dir. default use current path")
 | 
			
		||||
	fs.StringVar(&format, "f", "tar.gz", "format. [ tar.gz / zip ]")
 | 
			
		||||
	fs.StringVar(&excludeP, "exp", ".", "path exclude prefix. use : as separator")
 | 
			
		||||
	fs.StringVar(&excludeS, "exs", ".go:.DS_Store:.tmp", "path exclude suffix. use : as separator")
 | 
			
		||||
	fs.Var(&excludeR, "exr", "filename exclude by Regexp")
 | 
			
		||||
	fs.BoolVar(&fsym, "fs", false, "follow symlink")
 | 
			
		||||
	fs.BoolVar(&ssym, "ss", false, "skip symlink")
 | 
			
		||||
	fs.BoolVar(&verbose, "v", false, "verbose")
 | 
			
		||||
	fs.StringVar(&appPath, "p", "", "Set the application path. Defaults to the current path.")
 | 
			
		||||
	fs.BoolVar(&build, "b", true, "Tell the command to do a build for the current platform. Defaults to true.")
 | 
			
		||||
	fs.StringVar(&buildArgs, "ba", "", "Specify additional args for Go build.")
 | 
			
		||||
	fs.Var(&buildEnvs, "be", "Specify additional env variables for Go build. e.g. GOARCH=arm.")
 | 
			
		||||
	fs.StringVar(&outputP, "o", "", "Set the compressed file output path. Defaults to the current path.")
 | 
			
		||||
	fs.StringVar(&format, "f", "tar.gz", "Set file format. Either tar.gz or zip. Defaults to tar.gz.")
 | 
			
		||||
	fs.StringVar(&excludeP, "exp", ".", "Set prefixes of paths to be excluded. Uses a column (:) as separator.")
 | 
			
		||||
	fs.StringVar(&excludeS, "exs", ".go:.DS_Store:.tmp", "Set suffixes of paths to be excluded. Uses a column (:) as separator.")
 | 
			
		||||
	fs.Var(&excludeR, "exr", "Set a regular expression of files to be excluded.")
 | 
			
		||||
	fs.BoolVar(&fsym, "fs", false, "Tell the command to follow symlinks. Defaults to false.")
 | 
			
		||||
	fs.BoolVar(&ssym, "ss", false, "Tell the command to skip symlinks. Defaults to false.")
 | 
			
		||||
	fs.BoolVar(&verbose, "v", false, "Be more verbose during the operation. Defaults to false.")
 | 
			
		||||
	cmdPack.Flag = *fs
 | 
			
		||||
	cmdPack.Run = packApp
 | 
			
		||||
	cmdPack.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	w = NewColorWriter(os.Stdout)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type walker interface {
 | 
			
		||||
@@ -127,6 +112,7 @@ type walkFileTree struct {
 | 
			
		||||
	excludeRegexp []*regexp.Regexp
 | 
			
		||||
	excludeSuffix []string
 | 
			
		||||
	allfiles      map[string]bool
 | 
			
		||||
	output        *io.Writer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (wft *walkFileTree) setPrefix(prefix string) {
 | 
			
		||||
@@ -239,7 +225,7 @@ func (wft *walkFileTree) walkLeaf(fpath string, fi os.FileInfo, err error) error
 | 
			
		||||
 | 
			
		||||
	if added, err := wft.wak.compress(name, fpath, fi); added {
 | 
			
		||||
		if verbose {
 | 
			
		||||
			fmt.Fprintf(w, "\t%s%scompressed%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", name, "\x1b[0m")
 | 
			
		||||
			fmt.Fprintf(*wft.output, "\t%s%scompressed%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", name, "\x1b[0m")
 | 
			
		||||
		}
 | 
			
		||||
		wft.allfiles[name] = true
 | 
			
		||||
		return err
 | 
			
		||||
@@ -390,7 +376,7 @@ func (wft *zipWalk) compress(name, fpath string, fi os.FileInfo) (bool, error) {
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func packDirectory(excludePrefix []string, excludeSuffix []string,
 | 
			
		||||
func packDirectory(output io.Writer, excludePrefix []string, excludeSuffix []string,
 | 
			
		||||
	excludeRegexp []*regexp.Regexp, includePath ...string) (err error) {
 | 
			
		||||
 | 
			
		||||
	logger.Infof("Excluding relpath prefix: %s", strings.Join(excludePrefix, ":"))
 | 
			
		||||
@@ -408,6 +394,7 @@ func packDirectory(excludePrefix []string, excludeSuffix []string,
 | 
			
		||||
 | 
			
		||||
	if format == "zip" {
 | 
			
		||||
		walk := new(zipWalk)
 | 
			
		||||
		walk.output = &output
 | 
			
		||||
		zw := zip.NewWriter(w)
 | 
			
		||||
		defer func() {
 | 
			
		||||
			zw.Close()
 | 
			
		||||
@@ -421,6 +408,7 @@ func packDirectory(excludePrefix []string, excludeSuffix []string,
 | 
			
		||||
		wft = walk
 | 
			
		||||
	} else {
 | 
			
		||||
		walk := new(tarWalk)
 | 
			
		||||
		walk.output = &output
 | 
			
		||||
		cw := gzip.NewWriter(w)
 | 
			
		||||
		tw := tar.NewWriter(cw)
 | 
			
		||||
 | 
			
		||||
@@ -450,6 +438,7 @@ func packDirectory(excludePrefix []string, excludeSuffix []string,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func packApp(cmd *Command, args []string) int {
 | 
			
		||||
	output := cmd.Out()
 | 
			
		||||
	curPath, _ := os.Getwd()
 | 
			
		||||
	thePath := ""
 | 
			
		||||
 | 
			
		||||
@@ -463,7 +452,7 @@ func packApp(cmd *Command, args []string) int {
 | 
			
		||||
			nArgs = append(nArgs, a)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	cmdPack.Flag.Parse(nArgs)
 | 
			
		||||
	cmd.Flag.Parse(nArgs)
 | 
			
		||||
 | 
			
		||||
	if path.IsAbs(appPath) == false {
 | 
			
		||||
		appPath = path.Join(curPath, appPath)
 | 
			
		||||
@@ -532,7 +521,7 @@ func packApp(cmd *Command, args []string) int {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if verbose {
 | 
			
		||||
			fmt.Fprintf(w, "\t%s%s+ go %s%s%s\n", "\x1b[32m", "\x1b[1m", strings.Join(args, " "), "\x1b[21m", "\x1b[0m")
 | 
			
		||||
			fmt.Fprintf(output, "\t%s%s+ go %s%s%s\n", "\x1b[32m", "\x1b[1m", strings.Join(args, " "), "\x1b[21m", "\x1b[0m")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		execmd := exec.Command("go", args...)
 | 
			
		||||
@@ -545,7 +534,7 @@ func packApp(cmd *Command, args []string) int {
 | 
			
		||||
			logger.Fatal(err.Error())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		logger.Success("Build successful!")
 | 
			
		||||
		logger.Success("Build Successful!")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch format {
 | 
			
		||||
@@ -594,7 +583,7 @@ func packApp(cmd *Command, args []string) int {
 | 
			
		||||
 | 
			
		||||
	logger.Infof("Writing to output: %s", outputP)
 | 
			
		||||
 | 
			
		||||
	err = packDirectory(exp, exs, exr, tmpdir, thePath)
 | 
			
		||||
	err = packDirectory(output, exp, exs, exr, tmpdir, thePath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logger.Fatal(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								run.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								run.go
									
									
									
									
									
								
							@@ -24,12 +24,13 @@ import (
 | 
			
		||||
 | 
			
		||||
var cmdRun = &Command{
 | 
			
		||||
	UsageLine: "run [appname] [watchall] [-main=*.go] [-downdoc=true]  [-gendoc=true] [-vendor=true] [-e=folderToExclude]  [-tags=goBuildTags] [-runmode=BEEGO_RUNMODE]",
 | 
			
		||||
	Short:     "run the app and start a Web server for development",
 | 
			
		||||
	Short:     "Run the application by starting a local development server",
 | 
			
		||||
	Long: `
 | 
			
		||||
Run command will supervise the file system of the beego project using inotify,
 | 
			
		||||
it will recompile and restart the app after any modifications.
 | 
			
		||||
Run command will supervise the filesystem of the application for any changes, and recompile/restart it.
 | 
			
		||||
 | 
			
		||||
`,
 | 
			
		||||
	PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
 | 
			
		||||
	Run:    runApp,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -55,15 +56,13 @@ var (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cmdRun.Run = runApp
 | 
			
		||||
	cmdRun.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
 | 
			
		||||
	cmdRun.Flag.Var(&mainFiles, "main", "specify main go files")
 | 
			
		||||
	cmdRun.Flag.Var(&gendoc, "gendoc", "auto generate the docs")
 | 
			
		||||
	cmdRun.Flag.Var(&downdoc, "downdoc", "auto download swagger file when not exist")
 | 
			
		||||
	cmdRun.Flag.Var(&excludedPaths, "e", "Excluded paths[].")
 | 
			
		||||
	cmdRun.Flag.BoolVar(&vendorWatch, "vendor", false, "Watch vendor folder")
 | 
			
		||||
	cmdRun.Flag.StringVar(&buildTags, "tags", "", "Build tags (https://golang.org/pkg/go/build/)")
 | 
			
		||||
	cmdRun.Flag.StringVar(&runmode, "runmode", "", "Set BEEGO_RUNMODE env variable.")
 | 
			
		||||
	cmdRun.Flag.Var(&mainFiles, "main", "Specify main go files.")
 | 
			
		||||
	cmdRun.Flag.Var(&gendoc, "gendoc", "Enable auto-generate the docs.")
 | 
			
		||||
	cmdRun.Flag.Var(&downdoc, "downdoc", "Enable auto-download of the swagger file if it does not exist.")
 | 
			
		||||
	cmdRun.Flag.Var(&excludedPaths, "e", "List of paths to exclude.")
 | 
			
		||||
	cmdRun.Flag.BoolVar(&vendorWatch, "vendor", false, "Enable watch vendor folder.")
 | 
			
		||||
	cmdRun.Flag.StringVar(&buildTags, "tags", "", "Set the build tags. See: https://golang.org/pkg/go/build/")
 | 
			
		||||
	cmdRun.Flag.StringVar(&runmode, "runmode", "", "Set the Beego run mode.")
 | 
			
		||||
	exit = make(chan bool)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								util.go
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								util.go
									
									
									
									
									
								
							@@ -15,6 +15,7 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
@@ -24,6 +25,7 @@ import (
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"text/template"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -281,3 +283,27 @@ func __LINE__() int {
 | 
			
		||||
	_, _, line, _ := runtime.Caller(1)
 | 
			
		||||
	return line
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BeeFuncMap returns a FuncMap of functions used in different templates.
 | 
			
		||||
func BeeFuncMap() template.FuncMap {
 | 
			
		||||
	return template.FuncMap{
 | 
			
		||||
		"trim":       strings.TrimSpace,
 | 
			
		||||
		"bold":       bold,
 | 
			
		||||
		"headline":   MagentaBold,
 | 
			
		||||
		"foldername": RedBold,
 | 
			
		||||
		"endline":    EndLine,
 | 
			
		||||
		"tmpltostr":  TmplToString,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TmplToString parses a text template and return the result as a string.
 | 
			
		||||
func TmplToString(tmpl string, data interface{}) string {
 | 
			
		||||
	t := template.New("tmpl").Funcs(BeeFuncMap())
 | 
			
		||||
	template.Must(t.Parse(tmpl))
 | 
			
		||||
 | 
			
		||||
	var doc bytes.Buffer
 | 
			
		||||
	err := t.Execute(&doc, data)
 | 
			
		||||
	MustCheck(err)
 | 
			
		||||
 | 
			
		||||
	return doc.String()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,9 +14,9 @@ import (
 | 
			
		||||
 | 
			
		||||
var cmdVersion = &Command{
 | 
			
		||||
	UsageLine: "version",
 | 
			
		||||
	Short:     "prints the current Bee version",
 | 
			
		||||
	Short:     "Prints the current Bee version",
 | 
			
		||||
	Long: `
 | 
			
		||||
Prints the current Bee, Beego and Go version alongside the platform information
 | 
			
		||||
Prints the current Bee, Beego and Go version alongside the platform information.
 | 
			
		||||
 | 
			
		||||
`,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user