文件没有使用`-s`进行`gofmt`格式化:为什么会出现这种情况以及如何解决?

10
我们使用一个针对Golang的代码检查工具(linter),每当我们在我们的代码库上打开或更新拉取请求时,它会通过Github Actions工作流运行。
最近它开始返回以下错误: File is not `gofmt`-ed with `-s` (gofmt) 这是在另一个拉取请求中发生的事情,涉及到文件pkg/api/api/go
(编辑:添加链接以评估并可能复制该错误) 证据:

original commit

linter output

我希望了解这个错误的来源,并且知道如何解决它。

5
我用以下命令解决了问题: golangci-lint run --fix - rustyMagnet
1
这个 链接 的解决方案修复了我的问题。 - Zeinab Abbasimazar
2个回答

26

错误的来源

这个错误可能是因为文件没有按照Go规则正确格式化而返回的。

例如:如果您意外地使用了制表符缩进而不是空格缩进。

编辑:blackgreen的答案提供了更准确的关于错误来源的细节。


如何解决

您可以使用以下Go命令:

gofmt -s -w <path_to_file>.go

... 然后提交代码。

请注意,在我的情况下:gofmt -w pkg/api/api.go已足以解决问题(没有-s标志,我发现这有点奇怪,因为错误明确要求使用-s)。

来源1+来源2


如果您找到了一种演示问题的方法,应该将其添加到问题中;这可能会使它重新打开。 - Dour High Arch
有没有人知道在JetBrains的GoLand中是否有一种自动启用这个功能的方法,这样就不需要手动执行命令了? - Mb175

7
gofmt中的-s标志与格式无关,而是与简化代码有关:

尝试简化代码(应用重写规则后)。

您看到的警告来自golangci-lint。由于您声称通过运行gofmt -w修复了该错误,因此提示“使用-s”的存在可能是由于此错误引起的:https://github.com/golangci/golangci-lint/issues/513
链接的问题已在2019年得到解决,并随v1.17.0一起发布。您可能需要检查您的流水线是否使用较旧的版本。
假设您的文件 pkg/api/api.go 触发警告只是因为它没有格式化,gofmt -w 可以解决问题,因为 -w 会覆盖该文件:

如果文件格式与 gofmt 不同,则使用 gofmt 的版本覆盖该文件。


为什么格式不同了?我在存储库中有大约100个文件,刚刚检出来,唯一的解决方案是逐个文件进行 gofmt 吗? 我使用的是 Windows 系统,如果这会影响文件格式。 - Obaid Maroof
1
@ObaidMaroof,您不必逐个重新格式化每个文件。您可以向gofmt提供目录路径或使用shell扩展。 - blackgreen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接