Consider changing `cmd/` directory as cobra command recommendation
integrii opened this issue · 4 comments
Hello @spf13 and thank you for your many great contributions. I contributed to Hugo some time ago and use it for several sites!
The typical go pattern is to use the cmd
directory like an index of all buildable binaries in a project. Cobra directly conflicts with this by recommending that the cmd
directory is used to hold small packages which each contain cobra command packages.
Please consider recommending a more compatible file structure, such as this one that nests cobra commands with their relevant binaries:
project/
Dockerfile
kubernetes.yaml
README.md
cmd/
binaryNameA/
main.go
cobraCommandA/
cobraCommandA.go
cobraCommandB/
cobraCommandB.go
binaryNameB/
main.go
otherStuff.go
pkg/
packageName/
packageName.go
Or perhaps this layout, which organizes the cobra command packages as packages:
project/
Dockerfile
kubernetes.yaml
README.md
cmd/
binaryNameA/
main.go
binaryNameB/
main.go
otherStuff.go
pkg/
packageName/
packageName.go
cobraCommandA/
cobraCommandA.go
cobraCommandB/
cobraCommandB.go
The goal here is to enable the typical cmd/
directory behavior - rather than trying to make cobra users decide which layout to use.
Thanks again!
I ended up making my own flags package to solve this problem: https://github.com/integrii/flaggy
As I understand it, cobra doesn't require anything in particular, so this is a simple documentation change to the README. Is that right?
Or is this also related to the code generator.
For example, we use cobra with package directories per-subcommand here: https://github.com/ohsu-comp-bio/funnel/tree/master/cmd
I suppose you could always go against the recommended directory layout. My proposal was to change the recommended patterns.
I think its safe to close this for now :-)
I don't want to necromancy the issue or whatever, but the recommended layout generates a fair bit of confusion for new Gophers, as the pretty clear idiom in the rest of the ecosystem is to keep cmd/
free of actual .go
files, just a kind of directory namespace for other subdirs that hold whatever binaries are in the project.
A few other things in the codegen utility also seem to go against the grain: creating package names with_underscores, and naming files as camelCase.go instead of snake_case.go.