使用go 制作自己的命令行工具

为了方便工作中一些经常进行的操作我们都会写成工具来方便使用,今天我们就用go来实现一个命令行工具。

目的是在当前文件夹下build一个项目类似这种当然其中的go结尾文件都是自己加进去的:

使用go 制作自己的命令行工具_第1张图片

使用到的框架:

github.com/urfave/cli/v2

文档地址:https://github.com/urfave/cli/blob/master/docs/v2/manual.md

效果图:

使用go 制作自己的命令行工具_第2张图片

按照文档中解释以及demo选择自己需要的功能,详情查看注释即可:

github : https://github.com/zhumengyifang/golangtool

main.go:

package main

import (
	"buildgoprogram/internal"
	"fmt"
	"github.com/urfave/cli/v2"
	"log"
	"os"
)

/**
为了方便修改一些值定义成常量
 */
const title = "Build Go Program"
const usage = "Automatic directory creation"
const version = "1.0.1"

/**
初始化
 */
func main() {
	app := &cli.App{
		Name:    title,
		Usage:   usage,
		Version: version,
		Action:  buildAction,

		Commands: buildCommand(),
	}

	err := app.Run(os.Args)
	if err != nil {
		log.Fatal(err)
	}
}

/**
具体命令执行的操作
 */
func buildCommand() []*cli.Command {
	return []*cli.Command{
		{
			//命令 名
			Name:    "build",
			//命令 其他触发方式
			Aliases: []string{"b"},
			//命令 介绍
			Usage:   "Automatic directory creation",
			// 命令触发方法
			Action:  internal.BuildProgram,
		},
		{
			Name:    "time",
			Aliases: []string{"t"},
			Usage:   "Print Time",
			Action:  internal.PrintTime,
		},
	}
}

/**
未输出命令执行
 */
func buildAction(c *cli.Context) error {
	fmt.Println("Welcome to use!")
	return nil
}

buildProgram.go:

package internal

import (
	"bytes"
	"fmt"
	"github.com/urfave/cli/v2"
	"os/exec"
)

/**
方便进行其他build选项
 */
func BuildProgram(c *cli.Context) error {
	parameter := c.Args().First()
	switch parameter {
	case "default":
		return defaultBuild(c)
	default:
		return defaultBuild(c)
	}
	return nil
}

/**
基础build 只创建 api build cmd deployments docs examples  internal scripts tools web 文件夹
每个目录的介绍: https://blog.csdn.net/weixin_40165163/article/details/103255972
 */
func defaultBuild(c *cli.Context) error {
	err := pwd()
	if err != nil {
		return err
	}

	cmdStr := "mkdir api build cmd deployments docs examples  internal scripts tools web"
	err = mkdir(cmdStr)
	if err != nil {
		return err
	}

	fmt.Println("successful")
	return nil
}

/**
输出当前所在目录
 */
func pwd() error {
	cmd := exec.Command("sh", "-c", "pwd")
	opBytes, err := cmd.Output()
	if err != nil {
		return err
	}
	fmt.Println(string(opBytes))
	return nil
}

/**
创建所有文件夹
 */
func mkdir(cmdStr string) error {
	if cmdStr == "" {
		return nil
	}

	fmt.Println(cmdStr)
	cmd := exec.Command("sh", "-c", cmdStr)
	var stderr bytes.Buffer
	err := cmd.Run()

	if err != nil {
		fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
		return err
	}
	return nil
}

cliTime.go:

package internal

import (
	"fmt"
	"github.com/urfave/cli/v2"
	"time"
)

/**
打印当前时间 当时写的一个demo
 */
func PrintTime(c *cli.Context) error {
	now := time.Now()
	fmt.Printf("当前时间:%d-%d-%dT %d:%d:%d\n", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
	return nil
}

 

你可能感兴趣的:(Golang)