【问题标题】:Go fmt on a whole source tree在整个源代码树上执行 fmt
【发布时间】:2012-10-30 10:15:49
【问题描述】:

我目前有一个项目是这样组织的:

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

【问题讨论】:

  • 有趣。我的go fmt 文档说它是递归的,但我可以观察到它不是。

标签: go


【解决方案1】:

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

go fmt github.com/...

此通配符也适用于其他 go 命令,如 go list、go get 等。这么难看的 find 命令就不用记了。

【讨论】:

  • @Chris,使用... 作为通配符解释there
  • 我想知道为什么它是这样做的,而不是只使用标准通配符模式,如:github.com/* 或像 github.com/**/*.go 这样的通配符语法
【解决方案2】:

如果您使用gofmt 而不是go fmt,则它是递归的。比如下面的命令

gofmt -s -w .

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

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

【讨论】:

  • gofmt -l -s -w . 产生类似于go fmt 的行为(保存文件并打印已修改的文件)。如果没有 -l 标志,则不会打印文件名。
  • git ls-files | grep ".go$" | xargs gofmt -l -s -w 仅对签入到您的存储库的源文件执行此操作。
  • 是只影响 go 文件还是目录中的所有文件?
【解决方案3】:

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

go fmt ./...

来自您的项目目录。

【讨论】:

  • 如果. 是符号链接,则不起作用。我发现 Song's answer 与符号链接一起使用。
【解决方案4】:
find proj -type f -iregex '.*\.go' -exec go fmt '{}' +

说明

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

【讨论】:

  • 不错的命令,可惜 fmt 工具不能自动完成。不过,我确实做了一些调整:find src 而不是 find proj 从 $GOROOT 运行它,以及 \; 而不是 + 因为 fmt 工具在给定不同文件时不起作用目录。
  • 有用的命令,但我想做这样的事情git status | egrep '\.go$' .... 并使用你的命令我该怎么做?
  • @Cristian:您可能需要对awk 或cut 进行一些处理,以将其缩小为文件名列表;但是,一旦完成,您应该可以使用xargs,例如... | xargs go fmt.
【解决方案5】:

如果您使用的是 GoLand IDE,请右键单击项目,您将找到 Go Tools。

【讨论】:

    【解决方案6】:

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

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

    注意:golint ./... 可以在 Windows 上运行,而 gofmt ./... 则不行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多