File tree Expand file tree Collapse file tree 4 files changed +150
-0
lines changed
examples/singleapp/commandline_subcommands Expand file tree Collapse file tree 4 files changed +150
-0
lines changed Original file line number Diff line number Diff line change 1+ app
Original file line number Diff line number Diff line change 1+ # これは何?
2+
3+ ``` git ``` コマンドのように サブコマンド を持つコマンドラインを ``` flag ``` パッケージを使って構築する方法についてのメモです。
4+
5+ 実行すると以下のように表示されます。
6+
7+ ``` sh
8+ $ task
9+ task: [default] go build -o app
10+ task: [default] ./app
11+ Usage: app < cmd1| cmd2| version| help>
12+ Usage of cmd1:
13+ -c int
14+ option c
15+ Usage of cmd2:
16+ -f string
17+ option f
18+ task: [default] ./app help
19+ Usage: app < cmd1| cmd2| version| help>
20+ Usage of cmd1:
21+ -c int
22+ option c
23+ Usage of cmd2:
24+ -f string
25+ option f
26+ task: [default] ./app version
27+ version: vX.Y.Z (fe9c8eb719af1f17bcd9e2e7174c791e7ecd74c0)
28+ task: [default] ./app cmd1 -c 100
29+ option c is 100
30+ task: [default] ./app cmd2 -f helloworld
31+ option f is helloworld
32+ task: [default] ./app cmd1 -f helloworld
33+ flag provided but not defined: -f
34+ Usage of cmd1:
35+ -c int
36+ option c
37+ ```
38+
39+ ## 参考情報
40+
41+ - https://pkg.go.dev/flag@go1.22.1#FlagSet
42+ - https://gobyexample.com/command-line-subcommands
Original file line number Diff line number Diff line change 1+ # https://taskfile.dev
2+
3+ version : ' 3'
4+
5+ tasks :
6+ default :
7+ cmds :
8+ - go build -o app
9+ - ./app
10+ - ./app help
11+ - ./app version
12+ - ./app cmd1 -c 100
13+ - ./app cmd2 -f helloworld
14+ - ./app cmd1 -f helloworld
15+ ignore_error : true
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "flag"
5+ "log"
6+ "os"
7+ "runtime/debug"
8+ )
9+
10+ type subcommand string
11+
12+ const (
13+ subcmd1 subcommand = "cmd1"
14+ subcmd2 subcommand = "cmd2"
15+ subver subcommand = "version"
16+ subhelp subcommand = "help"
17+ )
18+
19+ // cmd1 subcommand
20+ var (
21+ cmd1 = flag .NewFlagSet ("cmd1" , flag .ExitOnError )
22+ cmd1OptC = cmd1 .Int ("c" , 0 , "option c" )
23+ )
24+
25+ // cmd2 subcommand
26+ var (
27+ cmd2 = flag .NewFlagSet ("cmd2" , flag .ExitOnError )
28+ cmd2OptF = cmd2 .String ("f" , "" , "option f" )
29+ )
30+
31+ func init () {
32+ log .SetFlags (0 )
33+ }
34+
35+ func main () {
36+ if len (os .Args ) < 2 {
37+ help ()
38+ os .Exit (1 )
39+ }
40+
41+ var (
42+ subcmd = subcommand (os .Args [1 ])
43+ args = os .Args [2 :]
44+ )
45+
46+ switch subcmd {
47+ case subcmd1 :
48+ cmd1 .Parse (args )
49+ runCmd1 ()
50+ case subcmd2 :
51+ cmd2 .Parse (args )
52+ runCmd2 ()
53+ case subver :
54+ version ()
55+ return
56+ case subhelp :
57+ help ()
58+ return
59+ default :
60+ help ()
61+ os .Exit (1 )
62+ }
63+ }
64+
65+ func runCmd1 () {
66+ log .Printf ("option c is %v" , * cmd1OptC )
67+ }
68+
69+ func runCmd2 () {
70+ log .Printf ("option f is %v" , * cmd2OptF )
71+ }
72+
73+ func version () {
74+ info , ok := debug .ReadBuildInfo ()
75+ if ! ok {
76+ log .Println ("error: call debug.ReadBuildInfo()" )
77+ os .Exit (1 )
78+ }
79+
80+ for _ , s := range info .Settings {
81+ if s .Key == "vcs.revision" {
82+ log .Printf ("version: vX.Y.Z (%s)" , s .Value )
83+ return
84+ }
85+ }
86+ }
87+
88+ func help () {
89+ log .Println ("Usage: app <cmd1|cmd2|version|help>" )
90+ cmd1 .Usage ()
91+ cmd2 .Usage ()
92+ }
You can’t perform that action at this time.
0 commit comments