交互式生成 GO 命令行程序
写在前面
关于如何从头开始编写一个 Go 命令行程序,在之前的文章中已经做过详细的介绍,本文不是介绍如何编写 Go 命令行程序,而是如何通过 shell 脚本快速创建一个 Go 命令行程序。
创建一个 GO 命令行程序的步骤
- 1、新建一个文件夹,进入文件夹执行模块初始化;
- 2、执行
cobra-cli init
; - 3、使用
cobra-cli add
添加一个具体的命令。
如果不需要子命令,也可以不执行第三步,直接在第二步生成的 root.go 中编写命令逻辑。下面来看一个具体的例子,比如我们想制作一个命令行程序,该程序的功能是输出一句伟大的编程箴言“hello world”。
假如我们的命令行程序就叫 hello,创建该命令行程序所需的命令如下:
mkdir hello
cd hello && go mod init github.com/vstar/hello
cobra-cli init
当然这前提是你已经安装了 cobra cli,如果没有安装 cobra,可以使用下面的命令提前安装 cobra cli:
go install github.com/spf13/cobra-cli@latest
这么简单三行命令值得编写一个交互式命令行程序吗?对我来说是值得的,命令行程序不是经常编写的,总是会忘记之前执行的命令,回过头去找过去执行的命令终归是一件不愉快事情。
我将脚本贴在下面,有需要同学自取:
#! /bin/bash
function require_input() {
local input=""
while [[ -z "$input" ]]; do
read -p "$1" input
done
echo "$input"
}
function confirm() {
local input=""
while [[ "$input" != "y" && "$input" != "n" ]]; do
read -p "$1 (y/n): " input
done
if [[ "$input" == "n" ]]; then
exit 1
fi
}
function is_dir_exists() {
if [[ ! -d "$1" ]]; then
echo 0
else
echo 1
fi
}
function green() {
echo -e "\e[32m$1\e[0m"
}
function red() {
echo -e "\e[31m$1\e[0m"
}
confirm "current dir is: $(pwd), project will be created here"
project_name=$(require_input "Project name: ")
project_path="$(pwd)/$project_name"
if [[ $(is_dir_exists $project_path) == 1 ]]; then
confirm "Directory $project_name already exists, proceed anyway?"
fi
mkdir -p $project_name
cd $project_name
project_mod=$(require_input "Project mod name: ")
go mod init $project_mod
which cobra-cli >/dev/null 2>&1
if [[ $? != 0 ]]; then
red "cobra-cli not found, please install it first"
fi
cobra-cli init
cmd_name=$(require_input "Command name: ")
cobra-cli add $cmd_name
green "Project created: $project_path"
脚本使用
将上面的脚本保存到 gocmd.sh,赋予脚本执行权限。
chmod u+x ./gocmd.sh
执行 ./gocmd.sh,效果如下
提醒一句,在上图中 Command name 那里,如果不希望创建子命令,可以直接按 ctrl+c
退出脚本程序。另外如果想随时随地运行 gocmd.sh,可以在 .bashrc 或者 .zshrc 中添加一个 alias。
alias gocmd="$HOME/scripts/gocmd.sh"
注意将路径修改成 gocmd.sh 所在的实际路径。重启 shell 后,在任何地方都可以执行 gocmd 了。
有问题吗?点此反馈!
温馨提示:反馈需要登录