在整个源代码树上进行fmt


74

我有一个项目目前正在组织这样的事情:

〜/代码/去
         /箱
         /公斤
         / 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命令在整个源代码树上运行?


1
有趣。在go fmt我的文档说,这是递归的,但我可以看到,它不是。
icktoofay 2012年

Answers:


107

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

go fmt github.com/...

此通配符还与像其他围棋命令go listgo get等等。无需记住这样一个难看的find命令。


6
@Chris,那里有使用...通配符的说明
kostix 2012年

1
我想知道为什么这样做是与仅使用标准通配符模式(例如github.com/*github.com/**/*.go
:)

60

如果使用gofmt代替go fmt,则它是递归的。例如,以下命令

gofmt -s -w .

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

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


9
gofmt -l -s -w .产生类似于go fmt(保存文件并打印已修改的文件)的行为。如果没有该-l标志,则不会打印文件名。
cr7pt0gr4ph7

git ls-files | grep ".go$" | xargs gofmt -l -s -w只能这样做以将源文件签入到您的仓库中。
戴夫

仅影响go文件或目录中的所有文件吗?
CME64

20

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

go fmt ./...

从您的项目目录。


如果.是符号链接则不起作用。我发现Song的答案与symlink一起使用。
ssgao

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

说明

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

好的命令,fmt工具不能自动执行此操作太糟糕了。我做了一对夫妇,虽然调整的:find src而不是find proj从运行它$GOROOT,并且\;,而不是+因为格式化工具不会当它因为在不同的目录中的文件的工作。
克里斯

有用的命令,但是我想做这样的事情, git status | egrep '\.go$' .... 并使用您的命令我该怎么做?
Cristian Chaparro A.

@Cristian:您可能需要对awk或做一些处理,cut以将其压缩为仅文件名列表;不过,一旦完成,您应该可以使用xargs,例如... | xargs go fmt
icktoofay

2

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

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

注意:golint ./...确实可以在Windows上使用,gofmt ./...但不能。


0

如果您使用的是GoLand IDE,请右键单击项目,您将找到Go Tools在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.