[转]在GoLand中使用golangci-lint

网友投稿 1746 2022-05-30

即使本文(原文:https://medium.com/nerd-for-tech/golangci-lint-and-the-goland-ide-42aabc14f7d5)是以 GoLand IDE 作为最终目标编写的,我猜这里的想法也适用于任何现代 IDE。

运行静态代码分析(又名掉毛golang程序)是对糟糕的编码和廉价的方式开始新的golang代码审查的做法防御的第一线。它也是持续集成管道中的第一个质量门。这篇文章是关于前者。

[转]在GoLand中使用golangci-lint

有一个完整的 golang linters 列表,单独运行每一个都不是很有趣。于是golangci-lint(https://golangci-lint.run/)诞生了。与单独运行每个 linter(可能在 shell 脚本的帮助下)相比,该软件将以非常有效的方式运行您喜欢的 linter。此外,习惯上只在 CI 管道中运行 linter,而不是在您的开发环境中运行。很多时候,人们最终会配置抑制“有问题”的 lint 错误,甚至更糟:一起禁用照明。

当 linting 成为敌人时

从命令行运行 golangci-lint(或任何与此相关的 linter)可能会导致问题列表,然后您需要在一个窗口中拥有该列表并在编辑器中手动修复问题。

雪上加霜的是,如果您使用的是操作系统的 Unix 衍生版本,那么有关如何在 JetBrains GoLand IDE 下运行 linter 的文档可能就足够了。事实上,一切都与 golangci-lint 文档中建议的设置相得益彰。但是,当仅限于企业环境开发设置时,安全性歇斯底里使您的 CPU 在实时扫描所有文件系统操作上花费太多周期……好吧……事情变慢了,您的 IDE 感觉就像是PTFE 覆盖的垂直杆。

此外,在编码时让 linter 喷出 lint 错误会使注意力从实际编码上移开。我想这可能是人们更喜欢编辑器(vim、Emacs、Sublime Text 等)和更简单的 IDE(如 VS Code)而不是可用的成熟 IDE 产品的原因之一。

这种干扰类似于违背您的意愿或无法控制的强制上下文切换(https://www.linkedin.com/pulse/context-switching-developers-paul-graham)。

很有可能你会说sod this并一起禁用linting。

按需运行 linter

任何 IDE 最酷的地方在于它的构建配置(又名。运行/调试配置)。大多数情况下,这些仅用于此目的:设置运行和调试配置。但是,瞧,通常,您可以设置运行/调试配置来运行 shell 脚本(Powershell 脚本确实属于这一类)。

注意:在下面的示例设置中,我将使用Gorm包。本文不反映包的质量,这里仅作为示例使用。我喜欢这个包并使用过它,并且不止一次推荐过它。

我喜欢使用 GoLand IDE,它具有足够的智能来检测我的程序生成的输出类型。除此之外,它将检测给定文件的路径以及相应的行号和列号。当点击链接时,编辑器的光标将被放置在文件的相应位置。

在 GoLand IDE 中运行 golangci-lint 时使用 tab 格式的示例输出。

您可能更喜欢 golangci-lint 产生的其他输出之一。我喜欢这种输出格式(名为tab),因为它的清晰度和减少信息过载。我发现此输出中缺少的是 lint 问题的严重性(默认情况下,golangci-lint 将所有内容都视为严重性错误)。

另一方面,默认输出对我来说太冗长了。

F:\gorm/callbacks\callbacks.go:28:24: Error return value of `queryCallback.Register` is not checked (errcheck) queryCallback.Register(“gorm:preload”, Preload) ^ F:\gorm/callbacks\callbacks.go:29:24: Error return value of `queryCallback.Register` is not checked (errcheck) queryCallback.Register(“gorm:after_query”, AfterQuery) ^ F:\gorm/callbacks\callbacks.go:32:50: Error return value of `(*gorm.io/gorm.callback).Register` is not checked (errcheck) deleteCallback.Match(enableTransaction).Register(“gorm:begin_transaction”, BeginTransaction)

您需要的第一件事是包装外壳脚本。撰写本文时考虑到了 Windows 的烦恼。因此,Powershell 就是这样。我们称这个文件为 linting.ps1:

$location = "$(Get-Location)" golangci-lint.exe run --out-format tab --path-prefix $location $args[0]

$args[0] 允许您将目录名称传递给脚本,从而可以一次仅对子包进行 lint。

您需要的第二件事是调用 Powershell 脚本的运行/调试配置(或者您可以调用 shell 脚本并将 Powershell 作为要使用的解释器)。当然,Jetbrains IDE 具有可用的 Powershell 配置。

Powershell 运行/调试配置示例。

您现在已准备好按需运行 linting。

使用运行/调试配置中的脚本参数字段通过传递相应的目录名称来分析子包。

关于下一步去哪里的建议

我发现您可能会考虑使用一些更好的做法:

定义要使用的短绒。有几种可用的 linter,启用所有内容和厨房水槽可能会适得其反,所以从默认值开始。要使用的 linter 可以作为命令行选项传递给 golangci-lint 程序。查看https://golangci-lint.run/usage/linters/以了解可用 linters 的概述。

太多的命令行选项会让生活变得一团糟。请改用配置文件。一个好的起点是https://golangci-lint.run/usage/configuration/#config-file。

通过修改配置文件来调整 linter 的行为。您的团队可能会发现,如果函数超过 60 行或 40 条语句,并且行长超过 120 个字符,那么它仍然具有可读性。

对整个存储库进行 lint 处理可能很诱人,但由于可能返回的 lint 错误数量众多,很快就会变得不堪重负。一次清理一个包是一种更好的方法。

关于配置文件选项的一些注意事项

我不会详细说明要使用哪些 linter 以及诸如此类的东西,因为本文的范围是IDE 内部的 linting。我将接触的唯一配置与此主题相关。

output: path-prefix: "" sort-results: true format: tab print-issued-lines: false print-linter-name: true uniq-by-line: false

前三个选项对于我们的按需上市最重要。

path-prefix: “”这个值无关紧要,因为它被(Power)shell 文件中的相应命令行选项覆盖。但为了清楚起见,空白和任何东西一样好。

sort-results: true您希望这样可以将每个文件组合在一起,而不是到处都是。

格式:tab如上所述,我发现tab格式比其他格式更容易阅读。

请自行决定使用以下选项:

print-issued-lines: false如果设置为true并使用任何其他格式化程序,则会产生非常冗长的输出。

print-linter-name: true了解哪些 linter 对什么做出反应是很有用的。

uniq-by-line: false 进一步减少可能的信息过载。

/**********************************golangci-lint 安装***********************************************/

https://asciinema.org/a/183662

安装:

Linux and Windows

# binary will be $(go env GOPATH)/bin/golangci-lint curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.41.1 golangci-lint --version

On Windows, you can run the above commands with Git Bash, which comes with Git for Windows.

Install from Source

Note: such go get installation aren't guaranteed to work. We recommend using binary installation.

go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.41.1

简单运行:

golangci-lint run

/*************************************题外话***********************************************/

https://asciinema.org/ Linux/mac控制台操作轻量的录制工具

安装:

Ubuntu sudo apt-add-repository ppa:zanchey/asciinema sudo apt-get update sudo apt-get install asciinema

cast文件嵌入参考:

https://github.com/asciinema/asciinema-player

PowerShell

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Web Service进阶(一)运行原理
下一篇:一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
相关文章