[转]在GoLand中使用golangci-lint

举报
Amrf 发表于 2021/06/20 20:01:46 2021/06/20
【摘要】 即使本文是以 GoLand IDE 作为最终目标编写的,我猜这里的想法也适用于任何现代 IDE。运行静态代码分析(又名掉毛golang程序)是对糟糕的编码和廉价的方式开始新的golang代码审查的做法防御的第一线。它也是持续集成管道中的第一个质量门。这篇文章是关于前者。有一个完整的 golang linters 列表,单独运行每一个都不是很有趣。于是golangci-lint(https:/...

即使本文(原文: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 配置。

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。