7.21 杭州源创会火热报名中,一起来看看移动开发如何紧跟浪潮?
Watch Star Fork

inhere / cliappGo

加入码云
与超过 300 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
golang下的命令行应用,工具库, cli色彩使用
Loading...
README_cn.md 11.25 KB

cliapp

golang下的命令行应用,工具库, cli色彩使用

EN Readme

功能特色

  • 使用简单方便
  • 可以添加多个命令,并且支持命令别名
  • 支持单个命令当做独立应用运行
  • 支持选项绑定,支持添加短选项
  • 支持丰富的颜色输出。同时支持html标签式的颜色渲染,兼容Windows
  • 自动生成命令帮助信息,并且支持颜色显示
  • 支持生成 zsh,bash 下的命令补全脚本文件

获取安装

  • 使用 dep 包管理
dep ensure -add gopkg.in/gookit/cliapp.v1 // 推荐
// OR
dep ensure -add github.com/gookit/cliapp
  • 使用 go get
go get gopkg.in/gookit/cliapp.v1 // 推荐
// OR
go get -u github.com/gookit/cliapp
  • git 克隆
git clone https://github.com/gookit/cliapp

快速开始

如下,引入当前包就可以快速的编写cli应用了

import "gopkg.in/gookit/cliapp.v1" // 推荐
// or
import "github.com/gookit/cliapp"
package main

import (
    "runtime"
    "github.com/gookit/cliapp"
    "github.com/gookit/cliapp/demo/cmd"
)

// for test run: go build ./demo/cliapp.go && ./cliapp
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    app := cliapp.NewApp()
    app.Version = "1.0.3"
    app.Verbose = cliapp.VerbDebug
    app.Description = "this is my cli application"

    app.Add(cmd.ExampleCommand())
    app.Add(cmd.GitCommand())
    app.Add(&cliapp.Command{
        Name: "demo",
        Aliases: []string{"dm"},
        // allow color tag and {$cmd} will be replace to 'demo'
        Description: "this is a description <info>message</> for command", 
        Fn: func (cmd *cliapp.Command, args []string) int {
            cliapp.Stdout("hello, in the demo command\n")
            return 0
        },
    })

    // .... add more ...

    app.Run()
}

Godoc

使用说明

先使用本项目下的 demo 示例代码构建一个小的cli demo应用

% go build ./demo/cliapp.go                                                           

打印版本信息

打印我们在创建cli应用时设置的版本信息

% ./cliapp --version
This is my cli application

Version: 1.0.3                                                           

应用帮助信息

使用 ./cliapp 或者 ./cliapp -h 来显示应用的帮助信息,包含所有的可用命令和一些全局选项

app-help

运行一个命令

% ./cliapp example --id 12 -c val ag0 ag1                          
hello, in example command
opts {id:12 c:val dir:}
args is [ag0 ag1]

显示一个命令的帮助

by ./cliapp {command} -h or ./cliapp {command} --help or ./cliapp help {command}

% ./cliapp example -h                                                
This is a description message

Name: example(alias: exp,ex)
Usage: ./cliapp example [--option ...] [argument ...]

Global Options:
  -h, --help        Display this help information

Options:
  -c string
        The short option (default value)
  --dir string
        The dir option
  --id int
        The id option (default 2)

Arguments:
  arg0        The first argument
  arg1        The second argument
 
Examples:
  ./cliapp example --id 12 -c val ag0 ag1

生成命令补全脚本

import  "github.com/gookit/cliapp/builtin"

    // ...
    // 添加内置提供的生成命令
    app.Add(builtin.GenShAutoComplete())

构建并运行生成命令(生成成功后可以去掉此命令):

% go build ./demo/cliapp.go && ./cliapp genac -h // 使用帮助
% go build ./demo/cliapp.go && ./cliapp genac // 开始生成, 你将会看到类似的信息
INFO: 
  {shell:zsh binName:cliapp output:auto-completion.zsh}

Now, will write content to file auto-completion.zsh
Continue? [yes|no](default yes): y

OK, auto-complete file generate successful

生成的shell script 文件请参看:

ok, 运行后就会在当前目录下生成一个 auto-completion.{zsh|bash} 文件, shell 环境名是自动获取的。当然你可以在运行时手动指定

编写命令

简单使用

app.Add(&cliapp.Command{
    Name: "demo",
    Aliases: []string{"dm"},
    // allow color tag and {$cmd} will be replace to 'demo'
    Description: "this is a description <info>message</> for command", 
    Fn: func (cmd *cliapp.Command, args []string) int {
        cliapp.Stdout("hello, in the demo command\n")
        return 0
    },
})

使用独立的文件

the source file at: example.go

package cmd

import (
	cli "github.com/gookit/cliapp"
	"fmt"
)

// The string flag list, implemented flag.Value interface
type Names []string

func (ns *Names) String() string {
	return fmt.Sprint(*ns)
}

func (ns *Names) Set(value string) error {
	*ns = append(*ns, value)
	return nil
}

// options for the command
var exampleOpts = struct {
	id  int
	c   string
	dir string
	opt string
	names Names
}{}

// ExampleCommand command definition
func ExampleCommand() *cli.Command {
	cmd := cli.Command{
		Fn:      exampleExecute,
		Name:    "example",
		Aliases: []string{"exp", "ex"},
		ArgList: map[string]string{
			"arg0": "the first argument",
			"arg1": "the second argument",
		},
		Description: "this is a description message",
		// {$binName} {$cmd} is help vars. '{$cmd}' will replace to 'example'
		Examples: `{$binName} {$cmd} --id 12 -c val ag0 ag1
  <cyan>{$fullCmd} --names tom --names john -n c</> test use special option`,
	}

	// use flag package func
	cmd.Flags.IntVar(&exampleOpts.id, "id", 2, "the id option")
	cmd.Flags.StringVar(&exampleOpts.c, "c", "value", "the short option")

	// use Command provided func
	cmd.StrOpt(&exampleOpts.dir, "dir", "d", "","the dir option")

	// setting option name and short-option name
	cmd.StrOpt(&exampleOpts.opt, "opt", "o", "", "the option message")

	// setting a special option var, it must implement the flag.Value interface
	cmd.VarOpt(&exampleOpts.names, "names", "n", "the option message")

	return &cmd
}

// command running
// example run:
// 	go build cliapp.go && ./cliapp example --id 12 -c val ag0 ag1
func exampleExecute(cmd *cli.Command, args []string) int {
	fmt.Print("hello, in example command\n")

	// fmt.Printf("%+v\n", cmd.Flags)
	fmt.Printf("opts %+v\n", exampleOpts)
	fmt.Printf("args is %v\n", args)

	return 0
}
  • 查看此命令的帮助信息:
go build ./demo/cliapp.go && ./cliapp example -h

漂亮的帮助信息就已经自动生成并展示出来了

cmd-help

使用颜色输出

颜色输出展示

colored-out

如何使用

package main

import (
    "github.com/gookit/color"
 )

func main() {
	// simple usage
	color.FgCyan.Printf("Simple to use %s\n", "color")

	// custom color
	color.New(color.FgWhite, color.BgBlack).Println("custom color style")

	// can also:
	color.Style{color.FgCyan, color.OpBold}.Println("custom color style")
	
	// use style tag
	color.Print("<suc>he</><comment>llo</>, <cyan>wel</><red>come</>\n")

	// set a style tag
	color.Tag("info").Println("info style text")

	// use info style tips
	color.Tips("info").Print("tips style text")

	// use info style blocked tips
	color.LiteTips("info").Print("blocked tips style text")
}

构建风格

// 仅设置前景色
color.FgCyan.Printf("Simple to use %s\n", "color")
// 仅设置背景色
color.BgRed.Printf("Simple to use %s\n", "color")

// 完全自定义 前景色 背景色 选项
style := color.New(color.FgWhite, color.BgBlack, color.OpBold)
style.Println("custom color style")

// can also:
color.Style{color.FgCyan, color.OpBold}.Println("custom color style")
// 设置console颜色
color.Set(color.FgCyan)

// 输出信息
fmt.Print("message")

// 重置console颜色
color.Reset()

使用内置风格

基础颜色方法

支持在windows cmd.exe 使用

  • color.Bold(args ...interface{})
  • color.Black(args ...interface{})
  • color.White(args ...interface{})
  • color.Gray(args ...interface{})
  • color.Red(args ...interface{})
  • color.Green(args ...interface{})
  • color.Yellow(args ...interface{})
  • color.Blue(args ...interface{})
  • color.Magenta(args ...interface{})
  • color.Cyan(args ...interface{})
color.Bold("bold message")
color.Yellow("yellow message")

扩展风格方法

支持在windows cmd.exe 使用

  • color.Info(args ...interface{})
  • color.Note(args ...interface{})
  • color.Light(args ...interface{})
  • color.Error(args ...interface{})
  • color.Danger(args ...interface{})
  • color.Notice(args ...interface{})
  • color.Success(args ...interface{})
  • color.Comment(args ...interface{})
  • color.Primary(args ...interface{})
  • color.Warning(args ...interface{})
  • color.Question(args ...interface{})
  • color.Secondary(args ...interface{})
color.Info("Info message")
color.Success("Success message")

使用颜色html标签

支持在windows cmd.exe 使用,但不影响使用,会自动去除颜色标签

使用颜色标签可以非常方便简单的构建自己需要的任何格式

// 使用内置的 color tag
color.Print("<suc>he</><comment>llo</>, <cyan>wel</><red>come</>")
color.Println("<suc>hello</>")
color.Println("<error>hello</>")
color.Println("<warning>hello</>")

// 自定义颜色属性
color.Print("<fg=yellow;bg=black;op=underscore;>hello, welcome</>\n")

使用 color.Tag

给后面输出的文本信息加上给定的颜色风格标签

// set a style tag
color.Tag("info").Print("info style text")
color.Tag("info").Printf("%s style text", "info")
color.Tag("info").Println("info style text")

内置的标签

这里列出了内置的标签,基本上涵盖了各种风格和颜色搭配。它们都可用作颜色html标签,或者作为 color.Tag color.Tips 等的参数

// Some internal defined style tags
// usage: <tag>content text</>

// basic tags
- red
- blue
- cyan
- black
- green
- brown
- white
- default  // no color
- normal// no color
- yellow  
- magenta 

// alert tags like bootstrap's alert
- suc // same "green" and "bold"
- success 
- info // same "green"
- comment  // same "brown"
- note 
- notice  
- warn
- warning 
- primary 
- danger // same "red"
- err 
- error

// more tags
- lightRed
- light_red
- lightGreen
- light_green
- lightBlue 
- light_blue
- lightCyan
- light_cyan
- lightDray
- light_gray
- gray
- darkGray
- dark_gray
- lightYellow
- light_yellow  
- lightMagenta  
- light_magenta 

// extra
- lightRedEx
- light_red_ex
- lightGreenEx
- light_green_ex 
- lightBlueEx
- light_blue_ex  
- lightCyanEx
- light_cyan_ex  
- whiteEx
- white_ex

// option
- bold
- underscore 
- reverse

参考项目

License

MIT

项目点评 ( 0 )

你可以在登录后,发表评论