urfave / cli

A simple, fast, and fun package for building command line apps in Go
https://cli.urfave.org
MIT License
21.89k stars 1.69k forks source link

DefaultCommand does not work when defined on a sub-Command #1880

Closed ananthb closed 2 months ago

ananthb commented 3 months ago

Checklist

What problem does this solve?

This maybe a bug. DefaultCommand should work on sub-commands too.

Solution description

If any Command anywhere has sub-commands and a DefaultCommand, then that should run by default.

Describe alternatives you've considered

None

ananthb commented 3 months ago

I've got a DefaultCommand on this sub-command which does not work: https://github.com/RealImage/bifrost/blob/36e773d2adcd2be64e69b871a80964829e6c2683/cmd/bf/ca.go#L28

dearchap commented 2 months ago

@ananthb Can you show me how you are invoking the command ?

ananthb commented 2 months ago

In that example above, I can invoke the ca subcommand either by not specifying any command and letting the root command's DefaultCommand execute ca or by directly calling bf ca.

Neither option actually invokes the default command on ca, which is serve.

If I run bf ca serve it works. I expected a plain bf to be equivalent to bf ca serve.

dearchap commented 2 months ago

Ah ok so you want a default command on subcommand to flow through to the root. Thats not how it works. It works only one level. so a bf ca and bf ca serve might be equivalent but we dont have the plumbing to decide that bf is equivalent to bf ca serve. I dont recall any cli tools having this kind of functionality but I might be mistaken.

ananthb commented 2 months ago

This might be simplistic but I thought of it as if a command has a default, then it should be executed if there are no arguments. Currently if a command at any level is run without arguments, this lib prints a help message. Setting a default command should replace that right?

dearchap commented 2 months ago

Not really. If you have required flags then yes it would print a help otherwise at that level the default command is run. If it doesnt then its a bug. Can you share a small code snipped that shows this ?

ananthb commented 2 months ago

I expected this example to print Hello, World!. It prints the help output for the hello command instead.

How can I get it to print Hello, World! when run without arguments?

dearchap commented 2 months ago

You need to do something like this

ananthb commented 2 months ago

Perfect, thanks!