交互式生成 GO 命令行程序

Last Modified: 2024/02/24

写在前面

关于如何从头开始编写一个 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 了。

有问题吗?点此反馈!

温馨提示:反馈需要登录