github.com/gofiber/fiber-cli@v0.0.3/cmd/new.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"time"
     7  
     8  	"github.com/spf13/cobra"
     9  )
    10  
    11  var templateType string
    12  
    13  func init() {
    14  	newCmd.Flags().StringVarP(&templateType, "template", "t", "basic", "basic|complex")
    15  }
    16  
    17  var newCmd = &cobra.Command{
    18  	Use:     "new PROJECT [module name]",
    19  	Aliases: []string{"n"},
    20  	Short:   "Generate a new fiber project",
    21  	Example: newExamples,
    22  	Args:    cobra.MinimumNArgs(1),
    23  	RunE:    newRunE,
    24  }
    25  
    26  func newRunE(cmd *cobra.Command, args []string) (err error) {
    27  	start := time.Now()
    28  
    29  	projectName := args[0]
    30  	modName := projectName
    31  	if len(args) > 1 {
    32  		modName = args[1]
    33  	}
    34  
    35  	wd, _ := os.Getwd()
    36  	projectPath := fmt.Sprintf("%s%c%s", wd, os.PathSeparator, projectName)
    37  
    38  	if err = createProject(projectPath); err != nil {
    39  		return
    40  	}
    41  	defer func() {
    42  		if err != nil {
    43  			_ = os.RemoveAll(projectPath)
    44  		}
    45  	}()
    46  
    47  	create := createBasic
    48  	if templateType != "basic" {
    49  		create = createComplex
    50  	}
    51  
    52  	defer func() {
    53  		if err == nil {
    54  			cmd.Printf(newSuccessTemplate,
    55  				projectPath, modName, projectName, formatLatency(time.Since(start)))
    56  		}
    57  	}()
    58  
    59  	return create(projectPath, modName)
    60  }
    61  
    62  func createProject(projectPath string) (err error) {
    63  	if err = os.Mkdir(projectPath, 0750); err != nil {
    64  		return
    65  	}
    66  
    67  	return os.Chdir(projectPath)
    68  }
    69  
    70  func createBasic(projectPath, modName string) (err error) {
    71  	// create main.go
    72  	if err = createFile(fmt.Sprintf("%s%cmain.go", projectPath, os.PathSeparator), newBasicTemplate); err != nil {
    73  		return
    74  	}
    75  
    76  	return runCmd(execCommand("go", "mod", "init", modName))
    77  }
    78  
    79  const boilerPlateRepo = "https://github.com/gofiber/boilerplate"
    80  
    81  func createComplex(projectPath, modName string) (err error) {
    82  	var git string
    83  	if git, err = execLookPath("git"); err != nil {
    84  		return
    85  	}
    86  
    87  	if err = runCmd(execCommand(git, "clone", boilerPlateRepo, projectPath)); err != nil {
    88  		return
    89  	}
    90  
    91  	if err = replace(projectPath, "go.mod", "boilerplate", modName); err != nil {
    92  		return
    93  	}
    94  
    95  	if err = replace(projectPath, "*.go", "boilerplate", modName); err != nil {
    96  		return
    97  	}
    98  
    99  	return
   100  }
   101  
   102  var (
   103  	newExamples = `  fiber new fiber-demo
   104      Generates a project with go module name fiber-demo
   105  
   106    fiber new fiber-demo your.own/module/name
   107      Specific the go module name
   108  
   109    fiber new fiber-demo -t=complex
   110      Generate a complex project`
   111  
   112  	newBasicTemplate = `package main
   113  
   114  import (
   115      "log"
   116  
   117      "github.com/gofiber/fiber/v2"
   118  )
   119  
   120  func main() {
   121      app := fiber.New()
   122  
   123      app.Get("/", func(c *fiber.Ctx) error {
   124          return c.SendString("Hello, World!")
   125      })
   126  
   127      log.Fatal(app.Listen(":3000"))
   128  }`
   129  
   130  	newSuccessTemplate = `
   131  Scaffolding project in %s (module %s)
   132  
   133    Done. Now run:
   134  
   135    cd %s
   136    fiber dev
   137  
   138  ✨  Done in %s.
   139  `
   140  )