// 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 new import ( "fmt" "os" path "path/filepath" "strings" "github.com/beego/bee/cmd/commands" "github.com/beego/bee/cmd/commands/version" beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger/colors" "github.com/beego/bee/utils" ) var gopath utils.DocValue var beegoVersion utils.DocValue var CmdNew = &commands.Command{ UsageLine: "new [appname] [-gopath=false] [-beego=v1.12.1]", Short: "Creates a Beego application", Long: ` Creates a Beego application for the given app name in the current directory. now default supoort generate a go modules project The command 'new' creates a folder named [appname] [-gopath=false] [-beego=v1.12.1] and generates the following structure: ├── main.go ├── go.mod ├── {{"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 `, PreRun: nil, Run: CreateApp, } var appconf = `appname = {{.Appname}} httpport = 8080 runmode = dev ` var maingo = `package main import ( _ "{{.Appname}}/routers" beego "github.com/astaxie/beego/server/web" ) func main() { beego.Run() } ` var router = `package routers import ( "{{.Appname}}/controllers" beego "github.com/astaxie/beego/server/web" ) func init() { beego.Router("/", &controllers.MainController{}) } ` var goMod = `module %s go %s require github.com/astaxie/beego %s require github.com/smartystreets/goconvey v1.6.4 ` var test = `package test import ( "net/http" "net/http/httptest" "testing" "runtime" "path/filepath" _ "{{.Appname}}/routers" beego "github.com/astaxie/beego/server/web" . "github.com/smartystreets/goconvey/convey" ) func init() { _, file, _, _ := runtime.Caller(0) apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator)))) beego.TestBeegoInit(apppath) } // TestBeego is a sample to run an endpoint test func TestBeego(t *testing.T) { r, _ := http.NewRequest("GET", "/", nil) w := httptest.NewRecorder() beego.BeeApp.Handlers.ServeHTTP(w, r) beego.Trace("testing", "TestBeego", "Code[%d]\n%s", w.Code, w.Body.String()) Convey("Subject: Test Station Endpoint\n", t, func() { Convey("Status Code Should Be 200", func() { So(w.Code, ShouldEqual, 200) }) Convey("The Result Should Not Be Empty", func() { So(w.Body.Len(), ShouldBeGreaterThan, 0) }) }) } ` var controllers = `package controllers import ( beego "github.com/astaxie/beego/server/web" ) type MainController struct { beego.Controller } func (c *MainController) Get() { c.Data["Website"] = "beego.me" c.Data["Email"] = "astaxie@gmail.com" c.TplName = "index.tpl" } ` var indextpl = ` Beego

Welcome to Beego

Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.
` var reloadJsClient = `function b(a){var c=new WebSocket(a);c.onclose=function(){setTimeout(function(){b(a)},2E3)};c.onmessage=function(){location.reload()}}try{if(window.WebSocket)try{b("ws://localhost:12450/reload")}catch(a){console.error(a)}else console.log("Your browser does not support WebSockets.")}catch(a){console.error("Exception during connecting to Reload:",a)}; ` func init() { CmdNew.Flag.Var(&gopath, "gopath", "Support go path,default false") CmdNew.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by go mod") commands.AvailableCommands = append(commands.AvailableCommands, CmdNew) } func CreateApp(cmd *commands.Command, args []string) int { output := cmd.Out() if len(args) == 0 { beeLogger.Log.Fatal("Argument [appname] is missing") } if len(args) >= 2 { err := cmd.Flag.Parse(args[1:]) if err != nil { beeLogger.Log.Fatal("Parse args err " + err.Error()) } } var appPath string var packPath string var err error if gopath == `true` { beeLogger.Log.Info("generate new project support GOPATH") version.ShowShortVersionBanner() appPath, packPath, err = utils.CheckEnv(args[0]) if err != nil { beeLogger.Log.Fatalf("%s", err) } } else { beeLogger.Log.Info("generate new project support go modules.") appPath = path.Join(utils.GetBeeWorkPath(), args[0]) packPath = args[0] if beegoVersion.String() == `` { beegoVersion.Set(`v1.12.1`) } } if utils.IsExist(appPath) { beeLogger.Log.Errorf(colors.Bold("Application '%s' already exists"), appPath) beeLogger.Log.Warn(colors.Bold("Do you want to overwrite it? [Yes|No] ")) if !utils.AskForConfirmation() { os.Exit(2) } } beeLogger.Log.Info("Creating application...") // If it is the current directory, select the current folder name to package path if packPath == "." { packPath = path.Base(appPath) } os.MkdirAll(appPath, 0755) if gopath != `true` { fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(appPath, "go.mod"), "\x1b[0m") utils.WriteToFile(path.Join(appPath, "go.mod"), fmt.Sprintf(goMod, packPath, utils.GetGoVersionSkipMinor(), beegoVersion.String())) } 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(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(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(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(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(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(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) utils.WriteToFile(path.Join(appPath, "static", "js", "reload.min.js"), reloadJsClient) 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(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(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(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(appPath, "conf", "app.conf"), "\x1b[0m") utils.WriteToFile(path.Join(appPath, "conf", "app.conf"), strings.Replace(appconf, "{{.Appname}}", path.Base(args[0]), -1)) 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") utils.WriteToFile(path.Join(appPath, "controllers", "default.go"), controllers) 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") utils.WriteToFile(path.Join(appPath, "views", "index.tpl"), indextpl) 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") utils.WriteToFile(path.Join(appPath, "routers", "router.go"), strings.Replace(router, "{{.Appname}}", packPath, -1)) 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") utils.WriteToFile(path.Join(appPath, "tests", "default_test.go"), strings.Replace(test, "{{.Appname}}", packPath, -1)) fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(appPath, "main.go"), "\x1b[0m") utils.WriteToFile(path.Join(appPath, "main.go"), strings.Replace(maingo, "{{.Appname}}", packPath, -1)) beeLogger.Log.Success("New application successfully created!") return 0 }