即使本文(原文:https://medium.com/nerd-for-tech/golangci-lint-and-the-goland-ide-42aabc14f7d5)是以 GoLand IDE 作为最终目标编写的,我猜这里的想法也适用于任何现代 IDE。
运行静态代码分析(又名掉毛golang程序)是对糟糕的编码和廉价的方式开始新的golang代码审查的做法防御的第一线。它也是持续集成管道中的第一个质量门。这篇文章是关于前者。
有一个完整的 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 配置。
您现在已准备好按需运行 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