Chris
Chris

Reputation: 17535

Go fmt on a whole source tree

I have a project currently organized something like this:

~/code/go
         /bin
         /pkg
         /src
             /proj/main.go
                  /some_package/package.go
                  /some_other_package/some_other_package.go

Now if I want to use the go fmt tool on my whole project it seems that the only way is to do it separately for each directory in my projects source tree:

go fmt proj
go fmt proj/package
go fmt proj/some_other_package

Is there some way to tell the fmt command to run on the whole source tree?

Upvotes: 117

Views: 70799

Answers (6)

sgauri
sgauri

Reputation: 714

if you are using GoLand IDE, right click on project and you will find Go Tools. enter image description here

Upvotes: 6

Csongor Halmai
Csongor Halmai

Reputation: 3895

The command gofmt ./... mentioned by some, does not work on Windows (at least on my Win7).

Instead of it, I used gofmt -d .\ which works recursively. I use the -d flag because I want to list the changes I need to make in order to pass the check.

NB: golint ./... does work on Windows, just gofmt ./... doesn't.

Upvotes: 3

cn0047
cn0047

Reputation: 17071

Also, you can try to run command:

go fmt ./...

from your project directory.

Upvotes: 58

Song Gao
Song Gao

Reputation: 2090

If you use gofmt instead of go fmt, it's recursive. For example, following command

gofmt -s -w .

(notice the little dot at end) recursively formats, simplifies, and saves result into every file under current directory. I have a shell alias gf defined as gofmt -s -w . and find it quite handy.

Try gofmt -l . (list files whose formatting differs from gofmt's) first if you want :-)

Upvotes: 97

tux21b
tux21b

Reputation: 94689

You can use three dots (...) as a wildcard. So for example, the following command will format all github.com packages:

go fmt github.com/...

This wildcard also works with other go commands like go list, go get and so. There is no need to remember such an ugly find command.

Upvotes: 147

icktoofay
icktoofay

Reputation: 129011

find proj -type f -iregex '.*\.go' -exec go fmt '{}' +

Explanation

  • find proj: find everything in this directory...
    • -type f: ...that is a file
    • -iregex '.*\.go': ...and case-insensitively matches the regular expression .*\.go
  • ...and execute go fmt followed by as many matched files as the operating system can handle passing to an executable in one go.

Upvotes: 6

Related Questions