GO · 패턴
CLI 도구 패턴
flag 패키지와 서브커맨드 패턴으로 CLI 도구를 구현합니다.
패턴고급cliflagsubcommandtool
핵심 설명
flag 패키지와 서브커맨드 패턴으로 CLI 도구를 구현합니다.
Go code
package main
import (
"flag"
"fmt"
"os"
)
type Command struct {
Name string
Desc string
Run func(args []string) error
}
func main() {
commands := map[string]*Command{
"serve": {Name: "serve", Desc: "서버 시작",
Run: func(args []string) error {
fs := flag.NewFlagSet("serve", flag.ExitOnError)
port := fs.Int("port", 8080, "포트 번호")
fs.Parse(args)
fmt.Printf("서버 시작: :%d\n", *port)
return nil
}},
"migrate": {Name: "migrate", Desc: "DB 마이그레이션",
Run: func(args []string) error {
fs := flag.NewFlagSet("migrate", flag.ExitOnError)
dir := fs.String("dir", "up", "방향 (up/down)")
fs.Parse(args)
fmt.Printf("마이그레이션: %s\n", *dir)
return nil
}},
}
if len(os.Args) < 2 {
fmt.Println("사용법: app <command> [options]")
for _, cmd := range commands {
fmt.Printf(" %-10s %s\n", cmd.Name, cmd.Desc)
}
os.Exit(1)
}
cmd, ok := commands[os.Args[1]]
if !ok {
fmt.Fprintf(os.Stderr, "알 수 없는 명령: %s\n", os.Args[1])
os.Exit(1)
}
if err := cmd.Run(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}학습 팁
실무에서는 cobra 라이브러리가 서브커맨드, 자동완성, 도움말 생성 등을 제공합니다.
주의할 점
os.Exit은 defer를 실행하지 않습니다. 정리 작업이 필요하면 os.Exit 전에 수행하세요.
자주 묻는 질문
CLI 도구 패턴란 무엇인가요?
flag 패키지와 서브커맨드 패턴으로 CLI 도구를 구현합니다.
CLI 도구 패턴 학습 시 주의할 점은 무엇인가요?
os.Exit 은 defer 를 실행하지 않습니다. 정리 작업이 필요하면 os.Exit 전에 수행하세요.