微吼云上線多路互動直播服務 加速多場景互動直播落地
1974
2025-04-01
即使本文(原文: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
PowerShell
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。