## 编写一个 Console 命令行 首先我们使用 `mix` 命令创建一个 Console 项目骨架: ~~~ mix new --name=hello ~~~ 我们打开 `main.go` 文件能发现该骨架程序使用 `github.com/mix-go/console` 开发,`console.NewApplication` 传入了一个配置信息,这个配置信息定义了该程序内部包含的命令配置和程序需要使用的 DI、IoC 容器依赖配置,这两个是 Console 最核心的两个配置。 - DI、IoC 容器依赖配置信息:manifest/beans - 命令配置信息:manifest/commands 然后我们在 `commands` 新建 `commands/hello.go` 文件: - 定义一个新的命令结构体 `HelloCommand` - `HelloCommand.Main` 方法为默认执行的入口方法 - 代码中获取了两个命令行参数,并将参数打印到屏幕 ~~~ package commands import ( "fmt" "github.com/mix-go/console/flag" ) type HelloCommand struct { } func (t *HelloCommand) Main() { name := flag.Match("n", "name").String("Xiao Ming") say := flag.Match("say").String("Hello, World!") fmt.Printf("%s: %s\n", name, say) } ~~~ 然后我们把上面的 `HelloCommand` 在 `manifest/commands` 中注册,新增一个命令配置: - 新建 `manifest/commands/hello.go` 文件 - 代码中采用 init 方法在程序初始化的时候自动执行,将一个新的 hello 命令追加到 Commands 全局变量中,最后传递到 `console.NewApplication` 中执行。 - CommandDefinition 中的字段信息都会在 `./go_build_main_go --help` 或者 `./go_build_main_go hello --help` 中以固定的格式呈现,自动完成一个带参数的命令行程序。 - Command 字段定义了 hello 命令将调用的结构体,通过这个功能我们就可以编写具有多个子功能的完整命令行程序。 - 注意:所有在程序中需要使用 flag.Match(***) 获取参数值的选项都必须在 Options 字段中定义。 ~~~ package commands import ( "github.com/mix-go/console" "github.com/mix-go/mix-console-skeleton/commands" ) func init() { Commands = append(Commands, console.CommandDefinition{ Name: "hello", Usage: "\tEcho demo", Options: []console.OptionDefinition{ { Names: []string{"n", "name"}, Usage: "Your name", }, { Names: []string{"say"}, Usage: "\tSay ...", }, }, Command: &commands.HelloCommand{}, }, ) } ~~~ ## 编译与测试 > 也可以在 Goland Run 里配置 Program arguments 直接编译执行,[Goland 使用] 章节有详细介绍 接下来我们编译上面的程序: ~~~ // linux & macOS go build -o bin/go_build_main_go main.go // win go build -o bin/go_build_main_go.exe main.go ~~~ 查看全部命令的帮助信息: ~~~ $ cd bin $ ./go_build_main_go Usage: ./go_build_main_go [OPTIONS] COMMAND [opt...] Global Options: -h, --help Print usage -v, --version Print version information Commands: db Database query demo hello Echo demo wp Worker pool demo wpd Worker pool daemon demo Run './go_build_main_go COMMAND --help' for more information on a command. Developed with Mix Go framework. (openmix.org/mix-go) ~~~ 查看上面编写的 hello 命令的帮助信息: ~~~ $ ./go_build_main_go hello --help Usage: ./go_build_main_go hello [opt...] Command Options: -n, --name Your name --say Say ... Developed with Mix Go framework. (openmix.org/mix-go) ~~~ 执行 `hello` 命令,并传入两个参数: ~~~ $ ./go_build_main_go hello --name=liujian --say=hello liujian: hello ~~~