在整个源树上进行fmt

时间:2012-11-10 04:11:58

标签: go

我目前有一个类似的项目:

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

现在,如果我想在整个项目中使用go fmt工具,似乎唯一的办法就是为项目源代码树中的每个目录单独执行:

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

有没有办法告诉fmt命令在整个源代码树上运行?

6 个答案:

答案 0 :(得分:82)

您可以使用三个点(...)作为通配符。因此,例如,以下命令将格式化所有github.com包:

go fmt github.com/...

此通配符也适用于其他go命令,例如go listgo get等。没有必要记住这样丑陋的查找命令。

答案 1 :(得分:35)

如果您使用gofmt而不是go fmt,那么它是递归的。例如,按照命令

gofmt -s -w .

(注意结尾处的小点)递归地格式化,简化并将结果保存到当前目录下的每个文件中。我将shell别名gf定义为gofmt -s -w .,并且发现它非常方便。

如果您需要,请先尝试gofmt -l .列出格式与gofmt的不同的文件): - )

答案 2 :(得分:5)

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

解释

  • find proj:找到此目录中的所有内容...
    • -type f:...这是一个文件
    • -iregex '.*\.go':...并且不区分大小写匹配正则表达式.*\.go
  • ...并执行go fmt后跟多个匹配的文件,因为操作系统可以一次性处理传递给可执行文件。

答案 3 :(得分:5)

此外,您可以尝试运行命令:

go fmt ./...

来自项目目录。

答案 4 :(得分:1)

某些人提到的命令gofmt ./...在Windows上不起作用(至少在我的Win7上)。

我改用gofmt -d .\来递归工作。我使用-d标志是因为我想列出为了通过检查而需要进行的更改。

注意:golint ./...在Windows上可以运行,只是gofmt ./...在Windows上不能运行。

答案 5 :(得分:0)

如果您使用的是GoLand IDE,请右键单击项目,您将找到Go Toolsenter image description here