🏃

Go言語でcliアプリを作ってみる

2024/12/02に公開

前置き

本記事は、みすてむずアドカレ その2の2日目の記事です。

みすてむずアドカレ2024の一覧

本記事の対象者

  • Go言語は書いたことあるけど、cliアプリを書いたことがない人
  • Go言語でどうやってcliのアプリを開発するのか気になる人
  • とにかく、cliアプリのHello Worldまでやりたい人

使用するライブラリ

注意点

  • Go言語のバージョンは1.23.0です。
  • 今回は、cobra-cliは使用しません。
    • めんどくさい というか、そんなに長いコードを書かないので、堅牢なプロジェクト設計にしなくてもいいだろうという判断です。
  • コードは我流です。
    • Go言語を独学で勉強してきたので、そこら辺は許してください。
  • main.goしか使用しません
    • 人によって、project名とか色々が違うと思うので、go mod init ~は終わってる状態から始めます。

0. Cobraって何

Cobra is a library for creating powerful modern CLI applications.
Cobra is used in many Go projects such as Kubernetes, Hugo, and GitHub CLI to name a few. This list contains a more extensive list of projects using Cobra.
from: spf13/cobra
どうやら、KubenetesとかHugo、Github CLIなんかで使われてるらしい?
(他にもCobraが使用されているアプリはたくさんあるんですが、長くなってしまうので、気になる方はここを見てみてください。)


1. ライブラリの導入

とりあえず、これを打てばok

go get "github.com/spf13/cobra@v1.8.1"

2. Hello Worldを出力してみる

package main

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use:   "hello",
	Short: "こんにちは世界",
	Long:  `なんか長めの説明文をどーーん!`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("Hello World!")
	},
}

func main() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

とりあえず、上のコードをmain.goにコピペして、go run main.goすれば...
Hello World!って出ると思います。
※ここで出ない場合は準備段階で間違えた可能性があるので、もう一度確認してみてください。


3. 2で使ったコードの解説

ここでは、部分ごとに解説をしていきます。

  • import文
import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
)

特に言うことなし!はい、次々〜

  • rootCmd
    コマンドが実行された時にどうするとか、説明文とかのコマンドを定義してる部分です。
var rootCmd = &cobra.Command{
	Use:   "hello",
	Short: "こんにちは世界",
	Long:  `なんか長めの説明文をどーーん!`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("Hello World!")
	},
}

フィールドごとの説明

フィールド名 役割
Use コマンド名
Short 短い説明文
Long Shortよりも長い説明文(helpコマンドで表示されます)
Run 実際にコマンドが実行された時に呼び出される関数
  • main関数
    rootCmdを実行しているだけ。
func main() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

ここでは、rootCmdにあるExecuteという、コマンドを実行する関数を呼び出していて、
コマンドの実行に失敗した時などに、errorが返ってくるので、if文でハンドリングしている。
エラーが起きた時に、エラー内容を表示して、終了コード1で終了する。

おわり

ということで、今回はGo言語でCobraを用いてcliアプリを作成してみました。
「物足りないなぁ」とか「もっと発展的なことがしてみたい!」って方は、7日目に「Go言語でチャットアプリを作ってみる」という記事が上がりますので、そちらもぜひぜひ〜

Cobraはいいぞ!

次へバトンタッチ

みすてむずアドカレ その2の明日の記事は、古道京紗さんの記事です!
もちろん、その後もアドカレは続いていくのでお楽しみに〜


おまけ

Cobraには、自動でhelpコマンドを生成する機能があるので、

go run main.go -h

って打ってあげると、

$ go run main.go -h
なんか長めの説明文をどーーん!

Usage:
  hello [flags]

Flags:
  -h, --help   help for hello

みたいに、さっきの説明文(Long)が表示されると思います。
まだ紹介していませんが、サブコマンドなどもあり、それらも同様に自動的にhelpコマンドで表示されます。

Discussion