2013-09-03 17:23:58 +00:00
|
|
|
// 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.
|
|
|
|
|
2013-07-24 11:20:30 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
path "path/filepath"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
var cmdNew = &Command{
|
|
|
|
UsageLine: "new [appname]",
|
2014-12-18 16:19:34 +00:00
|
|
|
Short: "Create a Beego application",
|
2013-07-24 11:20:30 +00:00
|
|
|
Long: `
|
2014-12-18 16:19:34 +00:00
|
|
|
Creates a Beego application for the given app name in the current directory.
|
2013-07-24 11:20:30 +00:00
|
|
|
|
2014-12-18 16:19:34 +00:00
|
|
|
The command 'new' creates a folder named [appname] and inside the folder deploy
|
|
|
|
the following files/directories structure:
|
2013-07-24 11:20:30 +00:00
|
|
|
|
|
|
|
|- main.go
|
|
|
|
|- conf
|
|
|
|
|- app.conf
|
|
|
|
|- controllers
|
|
|
|
|- default.go
|
|
|
|
|- models
|
2013-12-23 15:45:15 +00:00
|
|
|
|- routers
|
2014-06-24 09:01:31 +00:00
|
|
|
|- router.go
|
2013-12-23 15:28:31 +00:00
|
|
|
|- tests
|
|
|
|
|- default_test.go
|
|
|
|
|- static
|
2013-07-24 11:20:30 +00:00
|
|
|
|- js
|
|
|
|
|- css
|
2014-06-24 09:01:31 +00:00
|
|
|
|- img
|
2013-07-24 11:20:30 +00:00
|
|
|
|- views
|
2014-06-24 09:01:31 +00:00
|
|
|
index.tpl
|
2013-07-24 11:20:30 +00:00
|
|
|
|
|
|
|
`,
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
cmdNew.Run = createApp
|
|
|
|
}
|
|
|
|
|
2014-08-15 09:38:51 +00:00
|
|
|
func createApp(cmd *Command, args []string) int {
|
2013-07-24 11:20:30 +00:00
|
|
|
curpath, _ := os.Getwd()
|
|
|
|
if len(args) != 1 {
|
2013-10-30 23:39:44 +00:00
|
|
|
ColorLog("[ERRO] Argument [appname] is missing\n")
|
2013-07-24 11:20:30 +00:00
|
|
|
os.Exit(2)
|
|
|
|
}
|
|
|
|
|
|
|
|
gopath := os.Getenv("GOPATH")
|
|
|
|
Debugf("gopath:%s", gopath)
|
|
|
|
if gopath == "" {
|
2013-10-30 23:39:44 +00:00
|
|
|
ColorLog("[ERRO] $GOPATH not found\n")
|
|
|
|
ColorLog("[HINT] Set $GOPATH in your environment vairables\n")
|
2013-07-24 11:20:30 +00:00
|
|
|
os.Exit(2)
|
|
|
|
}
|
|
|
|
haspath := false
|
|
|
|
appsrcpath := ""
|
|
|
|
|
|
|
|
wgopath := path.SplitList(gopath)
|
|
|
|
for _, wg := range wgopath {
|
2015-04-16 03:57:20 +00:00
|
|
|
|
|
|
|
wg = path.Join(wg, "src")
|
2013-07-24 11:20:30 +00:00
|
|
|
|
2013-08-12 00:43:00 +00:00
|
|
|
if strings.HasPrefix(strings.ToLower(curpath), strings.ToLower(wg)) {
|
2013-07-24 11:20:30 +00:00
|
|
|
haspath = true
|
|
|
|
appsrcpath = wg
|
|
|
|
break
|
|
|
|
}
|
2015-04-16 03:57:20 +00:00
|
|
|
|
|
|
|
wg, _ = path.EvalSymlinks(wg)
|
|
|
|
|
|
|
|
if strings.HasPrefix(strings.ToLower(curpath), strings.ToLower(wg)) {
|
|
|
|
haspath = true
|
|
|
|
appsrcpath = wg
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
2013-07-24 11:20:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if !haspath {
|
2015-05-14 05:36:46 +00:00
|
|
|
ColorLog("[ERRO] Unable to create an application outside of $GOPATH%ssrc(%s%ssrc)\n", string(path.Separator), gopath, string(path.Separator)
|
2013-10-30 23:39:44 +00:00
|
|
|
ColorLog("[HINT] Change your work directory by `cd ($GOPATH%ssrc)`\n", string(path.Separator))
|
2013-07-24 11:20:30 +00:00
|
|
|
os.Exit(2)
|
|
|
|
}
|
|
|
|
|
|
|
|
apppath := path.Join(curpath, args[0])
|
|
|
|
|
2015-05-09 10:20:08 +00:00
|
|
|
if isExist(apppath) {
|
|
|
|
ColorLog("[ERRO] Path (%s) already exists\n", apppath)
|
|
|
|
ColorLog("[WARN] Do you want to overwrite it? [yes|no]]")
|
|
|
|
if !askForConfirmation() {
|
|
|
|
os.Exit(2)
|
|
|
|
}
|
2013-07-24 11:20:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("[INFO] Creating application...")
|
|
|
|
|
|
|
|
os.MkdirAll(apppath, 0755)
|
|
|
|
fmt.Println(apppath + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "conf"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "conf") + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "controllers"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "controllers") + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "models"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "models") + string(path.Separator))
|
2013-12-23 15:45:15 +00:00
|
|
|
os.Mkdir(path.Join(apppath, "routers"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "routers") + string(path.Separator))
|
2013-12-23 15:28:31 +00:00
|
|
|
os.Mkdir(path.Join(apppath, "tests"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "tests") + string(path.Separator))
|
2013-07-24 11:20:30 +00:00
|
|
|
os.Mkdir(path.Join(apppath, "static"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "static") + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "static", "js"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "static", "js") + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "static", "css"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "static", "css") + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "static", "img"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "static", "img") + string(path.Separator))
|
|
|
|
fmt.Println(path.Join(apppath, "views") + string(path.Separator))
|
|
|
|
os.Mkdir(path.Join(apppath, "views"), 0755)
|
|
|
|
fmt.Println(path.Join(apppath, "conf", "app.conf"))
|
|
|
|
writetofile(path.Join(apppath, "conf", "app.conf"), strings.Replace(appconf, "{{.Appname}}", args[0], -1))
|
|
|
|
|
|
|
|
fmt.Println(path.Join(apppath, "controllers", "default.go"))
|
|
|
|
writetofile(path.Join(apppath, "controllers", "default.go"), controllers)
|
|
|
|
|
|
|
|
fmt.Println(path.Join(apppath, "views", "index.tpl"))
|
|
|
|
writetofile(path.Join(apppath, "views", "index.tpl"), indextpl)
|
|
|
|
|
2013-12-23 15:28:31 +00:00
|
|
|
fmt.Println(path.Join(apppath, "routers", "router.go"))
|
|
|
|
writetofile(path.Join(apppath, "routers", "router.go"), strings.Replace(router, "{{.Appname}}", strings.Join(strings.Split(apppath[len(appsrcpath)+1:], string(path.Separator)), "/"), -1))
|
|
|
|
|
|
|
|
fmt.Println(path.Join(apppath, "tests", "default_test.go"))
|
|
|
|
writetofile(path.Join(apppath, "tests", "default_test.go"), strings.Replace(test, "{{.Appname}}", strings.Join(strings.Split(apppath[len(appsrcpath)+1:], string(path.Separator)), "/"), -1))
|
|
|
|
|
2013-07-24 11:20:30 +00:00
|
|
|
fmt.Println(path.Join(apppath, "main.go"))
|
2013-09-12 11:20:48 +00:00
|
|
|
writetofile(path.Join(apppath, "main.go"), strings.Replace(maingo, "{{.Appname}}", strings.Join(strings.Split(apppath[len(appsrcpath)+1:], string(path.Separator)), "/"), -1))
|
2013-07-24 11:20:30 +00:00
|
|
|
|
2013-10-30 23:39:44 +00:00
|
|
|
ColorLog("[SUCC] New application successfully created!\n")
|
2014-08-15 09:38:51 +00:00
|
|
|
return 0
|
2013-07-24 11:20:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var appconf = `appname = {{.Appname}}
|
|
|
|
httpport = 8080
|
|
|
|
runmode = dev
|
|
|
|
`
|
|
|
|
|
|
|
|
var maingo = `package main
|
|
|
|
|
|
|
|
import (
|
2013-12-23 16:00:52 +00:00
|
|
|
_ "{{.Appname}}/routers"
|
2013-07-24 11:20:30 +00:00
|
|
|
"github.com/astaxie/beego"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
beego.Run()
|
|
|
|
}
|
|
|
|
|
|
|
|
`
|
2013-12-23 16:00:52 +00:00
|
|
|
var router = `package routers
|
2013-12-23 15:28:31 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"{{.Appname}}/controllers"
|
|
|
|
"github.com/astaxie/beego"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
beego.Router("/", &controllers.MainController{})
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
var test = `package test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
2014-04-03 08:46:47 +00:00
|
|
|
"runtime"
|
|
|
|
"path/filepath"
|
2013-12-23 16:00:52 +00:00
|
|
|
_ "{{.Appname}}/routers"
|
2014-06-24 09:01:31 +00:00
|
|
|
|
2013-12-23 15:28:31 +00:00
|
|
|
"github.com/astaxie/beego"
|
|
|
|
. "github.com/smartystreets/goconvey/convey"
|
|
|
|
)
|
|
|
|
|
2014-04-03 08:41:44 +00:00
|
|
|
func init() {
|
|
|
|
_, file, _, _ := runtime.Caller(1)
|
2014-06-24 09:01:31 +00:00
|
|
|
apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator))))
|
2014-04-03 08:41:44 +00:00
|
|
|
beego.TestBeegoInit(apppath)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-12-23 15:28:31 +00:00
|
|
|
// TestMain is a sample to run an endpoint test
|
|
|
|
func TestMain(t *testing.T) {
|
2013-12-23 16:11:13 +00:00
|
|
|
r, _ := http.NewRequest("GET", "/", nil)
|
2013-12-23 15:28:31 +00:00
|
|
|
w := httptest.NewRecorder()
|
|
|
|
beego.BeeApp.Handlers.ServeHTTP(w, r)
|
2014-06-24 09:01:31 +00:00
|
|
|
|
2013-12-23 15:28:31 +00:00
|
|
|
beego.Trace("testing", "TestMain", "Code[%d]\n%s", w.Code, w.Body.String())
|
2014-06-24 09:01:31 +00:00
|
|
|
|
2013-12-23 15:28:31 +00:00
|
|
|
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)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
`
|
|
|
|
|
2013-07-24 11:20:30 +00:00
|
|
|
var controllers = `package controllers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/astaxie/beego"
|
|
|
|
)
|
|
|
|
|
|
|
|
type MainController struct {
|
|
|
|
beego.Controller
|
|
|
|
}
|
|
|
|
|
2014-11-05 14:48:09 +00:00
|
|
|
func (c *MainController) Get() {
|
|
|
|
c.Data["Website"] = "beego.me"
|
|
|
|
c.Data["Email"] = "astaxie@gmail.com"
|
|
|
|
c.TplNames = "index.tpl"
|
2013-07-24 11:20:30 +00:00
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
var indextpl = `<!DOCTYPE html>
|
|
|
|
|
|
|
|
<html>
|
2014-12-04 07:14:00 +00:00
|
|
|
<head>
|
|
|
|
<title>Beego</title>
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
|
|
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFNTdGOTA3OTczQTgxMUU0QTlEQUM0NEYyRkI1NEQxQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFNTdGOTA3QTczQTgxMUU0QTlEQUM0NEYyRkI1NEQxQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1N0Y5MDc3NzNBODExRTRBOURBQzQ0RjJGQjU0RDFCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1N0Y5MDc4NzNBODExRTRBOURBQzQ0RjJGQjU0RDFCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+lsWdMwAAIvtJREFUeNrke3d8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
|
|
|
|
|
|
|
|
<style type="text/css">
|
|
|
|
*,body {
|
|
|
|
margin: 0px;
|
|
|
|
padding: 0px;
|
|
|
|
}
|
|
|
|
|
|
|
|
body {
|
|
|
|
margin: 0px;
|
|
|
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
|
|
font-size: 14px;
|
|
|
|
line-height: 20px;
|
|
|
|
background-color: #fff;
|
|
|
|
}
|
|
|
|
|
|
|
|
header,
|
|
|
|
footer {
|
|
|
|
width: 960px;
|
|
|
|
margin-left: auto;
|
|
|
|
margin-right: auto;
|
|
|
|
}
|
|
|
|
|
|
|
|
.logo {
|
|
|
|
background-image: url('data:image/png;base64,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
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
-webkit-background-size: 100px 100px;
|
|
|
|
background-size: 100px 100px;
|
|
|
|
background-position: center center;
|
|
|
|
text-align: center;
|
|
|
|
font-size: 42px;
|
|
|
|
padding: 250px 0 70px;
|
|
|
|
font-weight: normal;
|
|
|
|
text-shadow: 0px 1px 2px #ddd;
|
|
|
|
}
|
|
|
|
|
|
|
|
header {
|
|
|
|
padding: 100px 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
footer {
|
|
|
|
line-height: 1.8;
|
|
|
|
text-align: center;
|
|
|
|
padding: 50px 0;
|
|
|
|
color: #999;
|
|
|
|
}
|
|
|
|
|
|
|
|
.description {
|
|
|
|
text-align: center;
|
|
|
|
font-size: 16px;
|
|
|
|
}
|
|
|
|
|
|
|
|
a {
|
|
|
|
color: #444;
|
|
|
|
text-decoration: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
.backdrop {
|
|
|
|
position: absolute;
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
box-shadow: inset 0px 0px 100px #ddd;
|
|
|
|
z-index: -1;
|
|
|
|
top: 0px;
|
|
|
|
left: 0px;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
|
|
|
|
<body>
|
|
|
|
<header>
|
|
|
|
<h1 class="logo">Welcome to Beego</h1>
|
|
|
|
<div class="description">
|
|
|
|
Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.
|
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
<footer>
|
|
|
|
<div class="author">
|
2014-12-18 16:19:34 +00:00
|
|
|
Official website:
|
|
|
|
<a href="http://{{.Website}}">{{.Website}}</a> /
|
|
|
|
Contact me:
|
2014-12-04 07:14:00 +00:00
|
|
|
<a class="email" href="mailto:{{.Email}}">{{.Email}}</a>
|
|
|
|
</div>
|
|
|
|
</footer>
|
|
|
|
<div class="backdrop"></div>
|
|
|
|
</body>
|
2013-07-24 11:20:30 +00:00
|
|
|
</html>
|
|
|
|
`
|
|
|
|
|
|
|
|
func writetofile(filename, content string) {
|
|
|
|
f, err := os.Create(filename)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
f.WriteString(content)
|
|
|
|
}
|