在整个源树上进行fmt

Chr*_*ris 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
Run Code Online (Sandbox Code Playgroud)

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

tux*_*21b 93

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

go fmt github.com/...
Run Code Online (Sandbox Code Playgroud)

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

  • 在你的工作目录中你可以```去fmt./ ...``` (28认同)
  • @Chris,使用`...`作为通配符解释[那里](http://golang.org/cmd/go/#Description_of_package_lists) (6认同)
  • 我想知道为什么这样做,而不是只使用标准通配符模式,如:“github.com/*”或通配符语法,如“github.com/**/*.go” (2认同)

Son*_*Gao 45

如果你使用gofmt而不是go fmt,它是递归的.例如,以下命令

gofmt -s -w .
Run Code Online (Sandbox Code Playgroud)

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

首先尝试gofmt -l .(列出格式与gofmt不同的文件):-)

  • `gofmt -l -s -w .`产生类似于`go fmt`的行为(保存文件并打印已修改的文件).如果没有`-l`标志,则不会打印文件名. (8认同)
  • `git ls 文件 | grep ".go$" | | grep ".go$" | xargs gofmt -l -s -w` 仅对签入存储库的源文件执行此操作。 (3认同)

Vla*_*pak 11

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

go fmt ./...
Run Code Online (Sandbox Code Playgroud)

从您的项目目录。


ick*_*fay 5

find proj -type f -iregex '.*\.go' -exec go fmt '{}' +
Run Code Online (Sandbox Code Playgroud)

说明

  • find proj:找到这个目录中的所有内容......
    • -type f:...那是一个文件
    • -iregex '.*\.go':...和case-insensitively匹配正则表达式 .*\.go
  • ...然后执行go fmt后跟多个匹配的文件,因为操作系统可以一次性处理传递给可执行文件.


sga*_*uri 5

如果您使用GoLand IDE,右键单击项目,您会发现Go Tools. 在此输入图像描述