Skip to content

Commit 9acc224

Browse files
authored
Merge pull request #779 from devlights/add-commanline-subcommand
2 parents fe9c8eb + 146349b commit 9acc224

File tree

4 files changed

+150
-0
lines changed

4 files changed

+150
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
app
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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+
}

0 commit comments

Comments
 (0)