为了方便工作中一些经常进行的操作我们都会写成工具来方便使用,今天我们就用go来实现一个命令行工具。
目的是在当前文件夹下build一个项目类似这种当然其中的go结尾文件都是自己加进去的:
文章图片
使用到的框架:
文档地址:https://github.com/urfave/cli/blob/master/docs/v2/manual.mdgithub.com/urfave/cli/v2
【使用go 制作自己的命令行工具】效果图:
文章图片
按照文档中解释以及demo选择自己需要的功能,详情查看注释即可:
github : https://github.com/zhumengyifang/golangtool
main.go:
package mainimport (
"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 internalimport (
"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 examplesinternal 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 examplesinternal 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 internalimport (
"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】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识