Earlier quoted context omitted.
Yeah.. I like cobra, but it seems to somewhat force you into using a lot of globals to accomplish things. The only downside to the oklog-style seems to be that you can't introspect the full cli tool at runtime, which rules out things like outputting documentation or shell completion files.
cobra / viper are nice, but to me they are a fair bit more heavyweight than mow. With mow also due to closures it seems easier to manage without globals, at least for programs where you don't also need a config file (which is where cobra / viper shines) but just simple cli it seems easier than rolling your own unless you just have one or two options.
And you are spot-on regarding closures: it was a design choice made expressly for the purpose of being able to:
- scope command specific flag and args, instead of having one giant catch-all context map
- declare real and typed Go variables instead of something like context.String("--option")
- use the same pattern as the flag std package (flag.Bool, etc.) which I liked a lot
Disclaimer: I am the author of mow.cli