fix api hprose project

This commit is contained in:
qiantao 2020-05-26 17:58:56 +08:00
parent 8ebc0adfd1
commit 0163d03646
5 changed files with 147 additions and 24 deletions

View File

@ -16,8 +16,10 @@ package apiapp
import ( import (
"fmt" "fmt"
"github.com/beego/bee/logger/colors"
"os" "os"
path "path/filepath" path "path/filepath"
"runtime"
"strings" "strings"
"github.com/beego/bee/cmd/commands" "github.com/beego/bee/cmd/commands"
@ -35,7 +37,7 @@ var CmdApiapp = &commands.Command{
The command 'api' creates a Beego API application. The command 'api' creates a Beego API application.
{{"Example:"|bold}} {{"Example:"|bold}}
$ bee api [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] $ bee api [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-module=true] [-beego=v1.12.1]
If 'conn' argument is empty, the command will generate an example API application. Otherwise the command 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. will connect to your database and generate models based on the existing tables.
@ -43,6 +45,7 @@ var CmdApiapp = &commands.Command{
The command 'api' creates a folder named [appname] with the following structure: The command 'api' creates a folder named [appname] with the following structure:
main.go main.go
go.mod
{{"conf"|foldername}} {{"conf"|foldername}}
app.conf app.conf
{{"controllers"|foldername}} {{"controllers"|foldername}}
@ -103,6 +106,13 @@ func main() {
beego.Run() beego.Run()
} }
`
var goMod = `
module %s
go %s
require github.com/astaxie/beego %s
` `
var apirouter = `// @APIVersion 1.0.0 var apirouter = `// @APIVersion 1.0.0
@ -533,11 +543,15 @@ func TestGet(t *testing.T) {
} }
` `
var module utils.DocValue
var beegoVersion utils.DocValue
func init() { func init() {
CmdApiapp.Flag.Var(&generate.Tables, "tables", "List of table names separated by a comma.") CmdApiapp.Flag.Var(&generate.Tables, "tables", "List of table names separated by a comma.")
CmdApiapp.Flag.Var(&generate.SQLDriver, "driver", "Database driver. Either mysql, postgres or sqlite.") CmdApiapp.Flag.Var(&generate.SQLDriver, "driver", "Database driver. Either mysql, postgres or sqlite.")
CmdApiapp.Flag.Var(&generate.SQLConn, "conn", "Connection string used by the driver to connect to a database instance.") CmdApiapp.Flag.Var(&generate.SQLConn, "conn", "Connection string used by the driver to connect to a database instance.")
CmdApiapp.Flag.Var(&module, "module", "Support go modules")
CmdApiapp.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by -module=true")
commands.AvailableCommands = append(commands.AvailableCommands, CmdApiapp) commands.AvailableCommands = append(commands.AvailableCommands, CmdApiapp)
} }
@ -548,14 +562,38 @@ func createAPI(cmd *commands.Command, args []string) int {
beeLogger.Log.Fatal("Argument [appname] is missing") beeLogger.Log.Fatal("Argument [appname] is missing")
} }
if len(args) > 1 { if len(args) >= 2 {
err := cmd.Flag.Parse(args[1:]) cmd.Flag.Parse(args[1:])
} else {
module = "false"
}
appPath := ``
packPath := ``
var err error
if module != `true` {
beeLogger.Log.Info("generate api project support GOPATH")
version.ShowShortVersionBanner()
appPath, packPath, err = utils.CheckEnv(args[0])
if err != nil { if err != nil {
beeLogger.Log.Error(err.Error()) beeLogger.Log.Fatalf("%s", err)
}
} else {
beeLogger.Log.Info("generate api 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)
} }
} }
appPath, packPath, err := utils.CheckEnv(args[0])
appName := path.Base(args[0]) appName := path.Base(args[0])
if err != nil { if err != nil {
beeLogger.Log.Fatalf("%s", err) beeLogger.Log.Fatalf("%s", err)
@ -567,6 +605,10 @@ func createAPI(cmd *commands.Command, args []string) int {
beeLogger.Log.Info("Creating API...") beeLogger.Log.Info("Creating API...")
os.MkdirAll(appPath, 0755) os.MkdirAll(appPath, 0755)
if module == `true` { //generate first for calc model name
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, runtime.Version()[2:], beegoVersion.String()))
}
fmt.Fprintf(output, "\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) 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"), "\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")

View File

@ -1,7 +1,9 @@
package hprose package hprose
import ( import (
"github.com/beego/bee/logger/colors"
"os" "os"
"runtime"
"fmt" "fmt"
"path" "path"
@ -11,7 +13,7 @@ import (
"github.com/beego/bee/cmd/commands/api" "github.com/beego/bee/cmd/commands/api"
"github.com/beego/bee/cmd/commands/version" "github.com/beego/bee/cmd/commands/version"
"github.com/beego/bee/generate" "github.com/beego/bee/generate"
beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger"
"github.com/beego/bee/utils" "github.com/beego/bee/utils"
) )
@ -24,7 +26,7 @@ var CmdHproseapp = &commands.Command{
{{"To scaffold out your application, use:"|bold}} {{"To scaffold out your application, use:"|bold}}
$ bee hprose [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] $ bee hprose [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-module=true] [-beego=v1.12.1]
If 'conn' is empty, the command will generate a sample application. Otherwise the command 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. will connect to your database and generate models based on the existing tables.
@ -32,6 +34,7 @@ var CmdHproseapp = &commands.Command{
The command 'hprose' creates a folder named [appname] with the following structure: The command 'hprose' creates a folder named [appname] with the following structure:
main.go main.go
go.mod
{{"conf"|foldername}} {{"conf"|foldername}}
app.conf app.conf
{{"models"|foldername}} {{"models"|foldername}}
@ -42,10 +45,23 @@ var CmdHproseapp = &commands.Command{
Run: createhprose, Run: createhprose,
} }
var goMod = `
module %s
go %s
require github.com/astaxie/beego %s
`
var module utils.DocValue
var beegoVersion utils.DocValue
func init() { func init() {
CmdHproseapp.Flag.Var(&generate.Tables, "tables", "List of table names separated by a comma.") CmdHproseapp.Flag.Var(&generate.Tables, "tables", "List of table names separated by a comma.")
CmdHproseapp.Flag.Var(&generate.SQLDriver, "driver", "Database driver. Either mysql, postgres or sqlite.") CmdHproseapp.Flag.Var(&generate.SQLDriver, "driver", "Database driver. Either mysql, postgres or sqlite.")
CmdHproseapp.Flag.Var(&generate.SQLConn, "conn", "Connection string used by the driver to connect to a database instance.") CmdHproseapp.Flag.Var(&generate.SQLConn, "conn", "Connection string used by the driver to connect to a database instance.")
CmdHproseapp.Flag.Var(&module, "module", "Support go modules")
CmdHproseapp.Flag.Var(&beegoVersion, "beego", "set beego version,only take effect by -module=true")
commands.AvailableCommands = append(commands.AvailableCommands, CmdHproseapp) commands.AvailableCommands = append(commands.AvailableCommands, CmdHproseapp)
} }
@ -60,16 +76,49 @@ func createhprose(cmd *commands.Command, args []string) int {
if len(args) > 1 { if len(args) > 1 {
cmd.Flag.Parse(args[1:]) cmd.Flag.Parse(args[1:])
} }
apppath, packpath, err := utils.CheckEnv(args[0])
if err != nil { if len(args) >= 2 {
beeLogger.Log.Fatalf("%s", err) cmd.Flag.Parse(args[1:])
} else {
module = "false"
} }
apppath := ``
packpath := ``
var err error
if module != `true` {
beeLogger.Log.Info("generate api 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 api 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)
}
}
if generate.SQLDriver == "" { if generate.SQLDriver == "" {
generate.SQLDriver = "mysql" generate.SQLDriver = "mysql"
} }
beeLogger.Log.Info("Creating Hprose application...") beeLogger.Log.Info("Creating Hprose application...")
os.MkdirAll(apppath, 0755) os.MkdirAll(apppath, 0755)
if module == `true` { //generate first for calc model name
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, runtime.Version()[2:], beegoVersion.String()))
}
fmt.Fprintf(output, "\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) 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"), "\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")

View File

@ -71,14 +71,14 @@ func init() {
func RunMigration(cmd *commands.Command, args []string) int { func RunMigration(cmd *commands.Command, args []string) int {
currpath, _ := os.Getwd() currpath, _ := os.Getwd()
gps := utils.GetGOPATHs() //gps := utils.GetGOPATHs()
if len(gps) == 0 { //if len(gps) == 0 {
beeLogger.Log.Fatal("GOPATH environment variable is not set or empty") // beeLogger.Log.Fatal("GOPATH environment variable is not set or empty")
} //}
//
gopath := gps[0] //gopath := gps[0]
//
beeLogger.Log.Debugf("GOPATH: %s", utils.FILE(), utils.LINE(), gopath) //beeLogger.Log.Debugf("GOPATH: %s", utils.FILE(), utils.LINE(), gopath)
// Getting command line arguments // Getting command line arguments
if len(args) != 0 { if len(args) != 0 {

View File

@ -302,6 +302,10 @@ func CreateApp(cmd *commands.Command, args []string) int {
beeLogger.Log.Info("Creating application...") beeLogger.Log.Info("Creating application...")
os.MkdirAll(appPath, 0755) os.MkdirAll(appPath, 0755)
if module == `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, runtime.Version()[2:], 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") 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) 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") 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")
@ -341,11 +345,6 @@ func CreateApp(cmd *commands.Command, args []string) int {
fmt.Fprintf(output, "\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")
utils.WriteToFile(path.Join(appPath, "main.go"), strings.Replace(maingo, "{{.Appname}}", packPath, -1)) utils.WriteToFile(path.Join(appPath, "main.go"), strings.Replace(maingo, "{{.Appname}}", packPath, -1))
if module == `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, runtime.Version()[2:], beegoVersion.String()))
}
beeLogger.Log.Success("New application successfully created!") beeLogger.Log.Success("New application successfully created!")
return 0 return 0
} }

View File

@ -15,15 +15,17 @@
package generate package generate
import ( import (
"bufio"
"database/sql" "database/sql"
"fmt" "fmt"
"io"
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"regexp" "regexp"
"strings" "strings"
beeLogger "github.com/beego/bee/logger" "github.com/beego/bee/logger"
"github.com/beego/bee/logger/colors" "github.com/beego/bee/logger/colors"
"github.com/beego/bee/utils" "github.com/beego/bee/utils"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
@ -946,6 +948,37 @@ func getFileName(tbName string) (filename string) {
} }
func getPackagePath(curpath string) (packpath string) { func getPackagePath(curpath string) (packpath string) {
if os.Getenv(`GO111MODULE`) == `on` {
beeLogger.Log.Infof("GO111MODULE = on,curpath: %s", curpath)
gomodpath := filepath.Join(curpath, `go.mod`)
re, err := regexp.Compile(`^module\s+(.+)$`)
if err != nil {
beeLogger.Log.Fatalf("generate regexp error:%s", err)
return ""
}
fd, err := os.Open(gomodpath)
if err != nil {
beeLogger.Log.Fatalf("Error while reading 'go.mod',%s", gomodpath)
}
reader := bufio.NewReader(fd)
for {
byteLine, _, er := reader.ReadLine()
if er != nil && er != io.EOF {
return ""
}
if er == io.EOF {
break
}
line := string(byteLine)
s := re.FindStringSubmatch(line)
if len(s) >= 2 {
return s[1]
}
}
beeLogger.Log.Fatalf("Error while parse 'go.mod',%s", gomodpath)
return ""
}
gopath := os.Getenv("GOPATH") gopath := os.Getenv("GOPATH")
if gopath == "" { if gopath == "" {
beeLogger.Log.Fatal("GOPATH environment variable is not set or empty") beeLogger.Log.Fatal("GOPATH environment variable is not set or empty")