Heim  >  Artikel  >  Backend-Entwicklung  >  Code-Automatisierungsinspektion, die Gopher kennen muss

Code-Automatisierungsinspektion, die Gopher kennen muss

Go语言进阶学习
Go语言进阶学习nach vorne
2023-07-25 15:20:291477Durchsuche

In diesem Artikel wird erklärt, wie man Git-Hooks verwendet, um eine automatisierte Codeüberprüfung des Git-Commits der Go-Sprache über zwei Hauptframeworks zu implementieren: golangci-lint und pre-commit. Statische Code-Inspektion Die eigene Suite der Go-Sprache stellt uns das statische Code-Analyse-Tool Veterinär zur Verfügung, mit dem Code im Go-Projekt überprüft werden kann, der kompilierbar ist, aber möglicherweise noch Fehler enthält. Leser, die ihn nicht verstehen, können die Einführung im vorherigen lesen Artikel

. Außer
<section powered-by="xiumi.us" style="margin: 10px 0%;box-sizing: border-box;">goimports<section style="display: inline-block;width: 100%;vertical-align: top;background-image: linear-gradient(to right, rgb(12, 14, 19) 0%, rgb(93, 88, 96) 100%);box-sizing: border-box;"></section></section>
Tool zum Formatieren von Code
<section powered-by="xiumi.us" style="text-align: center;justify-content: center;margin: 10px 0% -11px;box-sizing: border-box;">gofmt<section style="display: inline-block;width: auto;vertical-align: top;border-left: 3px solid rgb(206, 51, 51);border-bottom-left-radius: 0px;border-right: 3px solid rgb(206, 51, 51);border-top-right-radius: 0px;min-width: 10%;max-width: 100%;height: auto;box-sizing: border-box;"></section></section>
und der

<strong>golint</strong>

Werkzeug.
Die oben genannten Tools können aufgerufen werden
linter. Hier müssen wir zunächst wissen, was Flusen sind. In Wikipedia wird Flusen wie folgt definiert:

In der Informatik ist lint der Name eines Werkzeugprogramms, das dazu dient, bestimmte verdächtige und unstrukturierte (möglicherweise Fehler verursachende) Passagen im Quellcode zu markieren. Es handelt sich um ein statisches Programmanalysetool, das zunächst an die C-Sprache angepasst und auf der UNIX-Plattform entwickelt wurde. Später wurde daraus ein allgemeiner Begriff, mit dem ein Werkzeug beschrieben werden kann, das in jeder Computerprogrammiersprache verwendet wird, um fragwürdige Passagen im Quellcode zu markieren.

Im Bereich der Go-Sprache ist golangci-lint ein umfassendes Linter-Framework. Es integriert viele Linters, darunter einige der oben genannten. Die ordnungsgemäße Verwendung kann uns helfen, Go-Code umfassender zu analysieren und zu überprüfen. Die von golangci-lint unterstützten Linter-Artikel können auf der Seite eingesehen werdenhttps://golangci-lint.run/usage/linters/#golint

Verwenden Sie golangci-lint

Herunterladen
1go get github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Überprüfen Sie, ob die Installation erfolgreich war
1$ golangci-lint version
2golangci-lint has version v1.41.1 built from (unknown, mod sum: "h1:KH28pTSqRu6DTXIAANl1sPXNCmqg4VEH21z6G9Wj4SM=") on (unknown)
Hilfedokument ansehen
1$ golangci-lint help linters
  • Lin in Kraft standardmäßig ters

Code-Automatisierungsinspektion, die Gopher kennen muss


  • Linters sind standardmäßig nicht wirksam

Code-Automatisierungsinspektion, die Gopher kennen muss


  • linters 的分类

Code-Automatisierungsinspektion, die Gopher kennen muss

可以看出,golangci-lint 框架支持的 linter 非常全面,它包括了 bugs、error、format、unused、module 等常见类别的分析 linter。

实例

下面来展示使用示例,现有以下项目结构代码

1.
2├── go.mod
3├── main.go
4└── typecheck
5    └── typecheckDemo.go

其中 <span style="font-size: 15px;letter-spacing: 1px;">main.go</span> 中的代码如下

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7func main() {
 8    s1 := "this is a string"
 9    fmt.Printf("inappropriate formate %s\n", &s1)
10
11    i := 1
12    fmt.Println(i != 0 || i != 1)
13
14    arr := []int{1, 2, 3}
15    for _, i := range arr {
16        go func() {
17            fmt.Println(i)
18        }()
19    }
20}

<span style="font-size: 15px;letter-spacing: 1px;">typecheckDemo.go</span> 中的代码

 1package typecheck
 2
 3import "fmt"
 4
 5func check() {
 6    t := unexistType{}
 7    fmt.Println(t)
 8}
 9
10func unused() {
11    i := 1
12}

这两个源码文件中的代码都是存在一些问题的。此时,我们通过 golangci-lint 工具来对源码文件进行检查

Code-Automatisierungsinspektion, die Gopher kennen muss

可以看到,我们在程序根目录中执行 <span style="font-size: 15px;letter-spacing: 1px;">golangci-lint run</span> 命令,它等效于 <span style="font-size: 15px;letter-spacing: 1px;">golangci-lint run ./...</span> 。此时,它将 <span style="font-size: 15px;letter-spacing: 1px;">main.go</span><span style="font-size: 15px;letter-spacing: 1px;">typecheckDemo.go</span> 中存在的潜在问题都检测到了,并标记了是何种 linter 检测(这里是 typecheck 和 govet 两种)到的。

当然,也可以通过命令 <span style="font-size: 15px;letter-spacing: 1px;">golangci-lint run dir1 dir2/... dir3/file1.go</span> 对某特定的文件或文件夹进行分析。

灵活运用命令选项
  • golangci-lint 可以通过 <span style="font-size: 15px;">-E/--enable</span> 去开启指定 linter,或者 <span style="font-size: 15px;">-D/--disable</span> 禁止指定 linter。

1golangci-lint run --disable-all -E errcheck

如上命令代表的就是除了 <span style="font-size: 15px;letter-spacing: 1px;">errcheck</span> 的 linter,禁止其他所有的 linter 生效。

  • golangci-lint 还可以通过 <span style="font-size: 15px;">-p/--preset</span> 指定一系列 linter 开启。

1golangci-lint run -p bugs -p error

如上命令代表的就是所有属于 <span style="font-size: 15px;letter-spacing: 1px;">bugs</span><span style="font-size: 15px;letter-spacing: 1px;">error</span> 分类的 linter 生效。

  • 更多命令选项,可以通过 <span style="font-size: 15px;">golangci-lint run -h</span> 查看

配置文件

当然,如果我们要为项目配置 golangci-lint,最好的方式还是配置文件。golangci-lint 在当前工作目录按如下顺序搜索配置文件。

  • .golangci.yml

  • .golangci.yaml

  • .golangci.toml

  • .golangci.json

在 golangci-lint 官方文档 https://golangci-lint.run/usage/configuration/#config-file 中,提供了一个示例配置文件,非常地详细,在这其中包含了所有支持的选项、描述和默认值。

在这里给出一个比较不错的配置示例文档

 1linters-settings:
 2  errcheck:
 3    check-type-assertions: true
 4  goconst:
 5    min-len: 2
 6    min-occurrences: 3
 7  gocritic:
 8    enabled-tags:
 9      - diagnostic
10      - experimental
11      - opinionated
12      - performance
13      - style
14  govet:
15    check-shadowing: true
16  nolintlint:
17    require-explanation: true
18    require-specific: true
19
20linters:
21  disable-all: true
22  enable:
23    - bodyclose
24    - deadcode
25    - depguard
26    - dogsled
27    - dupl
28    - errcheck
29    - exportloopref
30    - exhaustive
31    - goconst
32    - gocritic
33    - gofmt
34    - goimports
35    - gomnd
36    - gocyclo
37    - gosec
38    - gosimple
39    - govet
40    - ineffassign
41    - misspell
42    - nolintlint
43    - nakedret
44    - prealloc
45    - predeclared
46    - revive
47    - staticcheck
48    - structcheck
49    - stylecheck
50    - thelper
51    - tparallel
52    - typecheck
53    - unconvert
54    - unparam
55    - varcheck
56    - whitespace
57    - wsl
58
59run:
60  issues-exit-code: 1
<br/>

使用 pre-commit hook

在项目开发中,我们都会使用到 git,因此我们可以将代码静态检查放在一个 git 触发点上,而不用每次写完代码手动去执行 <span style="font-size: 15px;letter-spacing: 1px;">golangci-lint run</span> 命令。这里,我们就需要用到 git hooks。

Git-Hooks

Git-Hooks ist ein Hook-Mechanismus von Git, der es Benutzern ermöglicht, benutzerdefinierte Logik in verschiedenen Phasen von Git-Operationen auszuführen. Git-Hooks <code style="font-size: inherit;line-height: inherit;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(233, 105, 0);background: rgb(248, 248, 248);"><span style="font-size: 15px;letter-spacing: 1px;">.git/hooks</span> 下面配置,配置文件的名称是固定的,实质上就是一个个 shell 脚本。根据 git 执行体,钩子被分为客户端钩子和服务端钩子两类。

客户端钩子包括:<span style="font-size: 15px;letter-spacing: 1px;">pre-commit</span><span style="font-size: 15px;letter-spacing: 1px;">prepare-commit-msg</span><span style="font-size: 15px;letter-spacing: 1px;">commit-msg</span><span style="font-size: 15px;letter-spacing: 1px;">post-commit</span>等,主要用于控制客户端git的提交工作流。服务端钩子:<span style="font-size: 15px;letter-spacing: 1px;">pre-receive</span><span style="font-size: 15px;letter-spacing: 1px;">post-receive</span><span style="font-size: 15px;letter-spacing: 1px;">update</span>.git/hooks Die folgende Konfiguration, der Name der Konfiguration Datei ist behoben, bei denen es sich im Wesentlichen um Shell-Skripte handelt. Gemäß dem Git-Ausführungskörper werden Hooks in zwei Kategorien unterteilt: Client-Hooks und Server-Hooks.

Clientseitige Hooks umfassen:

<p style="font-size: 16px;text-align: center;">pre-commit<img src="https://img.php.cn/upload/article/001/272/559/fd95cd7aca3fab8aa5e73d87f5c52ee0-4.png" alt="Code-Automatisierungsinspektion, die Gopher kennen muss" ></p>

, 🎜🎜prepare-commit-msg🎜🎜, 🎜🎜commit-msg🎜🎜, 🎜🎜post-commit🎜🎜 usw. Wird hauptsächlich verwendet, um den Übermittlungsworkflow des Client-Git zu steuern. Server-Hook: 🎜🎜pre-receive🎜🎜, 🎜🎜post-receive🎜🎜, 🎜🎜update🎜 Code >🎜, wird hauptsächlich aufgerufen, wenn der Server das übermittelte Objekt empfängt und bevor es an den Server gesendet wird. 🎜🎜🎜🎜Beachten Sie, dass Dateinamen, die mit .sample enden, offizielle Beispiele sind, die nicht ausgeführt werden und erst nach dem Umbenennen (Entfernen des Suffixes .sample) wirksam werden. 🎜🎜🎜🎜🎜<p style="font-size: inherit;color: inherit;line-height: inherit;margin-top: 1.5em;margin-bottom: 1.5em;"><span style="font-size: 15px;letter-spacing: 1px;">而 pre-commit 正如其名一样,它在 </span><code style="font-size: inherit;line-height: inherit;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(233, 105, 0);background: rgb(248, 248, 248);"><span style="font-size: 15px;letter-spacing: 1px;">git add</span> 提交之后,运行 <span style="font-size: 15px;letter-spacing: 1px;">git commit</span> 时执行,脚本执行没报错就继续提交,反之就驳回提交的操作。

pre-commit

试想,如果我们同时开发多个项目,也许项目的所采用的的编程语言并不一样,那么它们所需要的 git hooks 将不一致,此时我们是否要手动给每个项目都配置一个单独的 pre-commit 脚本呢,或者我们是否要去手动下载每一个钩子脚本呢。

实际上,并不需要这么麻烦。这里就引出了 pre-commit 框架,它是一个与语言无关的用于管理 git hooks 钩子脚本的工具(虽然采用 Python 开发,但不止于 Python )。

  • 安装

1$ pip install pre-commit
2或者
3$ curl https://pre-commit.com/install-local.py | python -
4或者
5$ brew install pre-commit
  • 安装成功

1$ pre-commit --version
2pre-commit 1.20.0
  • 编写配置文件

首先我们在项目根目录下新建一个 <span style="font-size: 15px;letter-spacing: 1px;">.pre-commit-config.yaml</span> 文件,这个文件我们可以通过 <span style="font-size: 15px;letter-spacing: 1px;">pre-commit sample-config</span> 得到最基本的配置模板,通过 pre-commit 支持的 hooks 列表 https://pre-commit.com/hooks.html 中,我们找到了 golangci-lint。

Code-Automatisierungsinspektion, die Gopher kennen muss

因此,使用 golangci-lint 的 <span style="font-size: 15px;letter-spacing: 1px;">.pre-commit-config.yaml</span> 配置内容如下

1repos:
2-   repo: https://github.com/golangci/golangci-lint
3    rev: v1.41.1 # the current latest version
4    hooks:
5    -   id: golangci-lint
  • 安装 git hook 脚本

运行 <span style="font-size: 15px;letter-spacing: 1px;">pre-commit install</span> 命令根据配置文件安装

1$ pre-commit install
2pre-commit installed at .git/hooks/pre-commit

此时,生成了新的 Python 语言编写的 <span style="font-size: 15px;letter-spacing: 1px;">.git/hooks/pre-commit</span> 钩子文件。

  • git commit 触发 golangci-lint 检查

Code-Automatisierungsinspektion, die Gopher kennen muss

首次运行时,由于 pre-commit 没有 golangci-lint 的环境,会初始化下载安装相关依赖。在下一次 git-commit 的时候,就不会有前三行信息了。

如上图所示,报错内容和我们手动执行 <span style="font-size: 15px;letter-spacing: 1px;">golangci-lint run</span> 命令输出的一样,只有当我们将代码更改正确,才能顺利通过检查,从而 commit 成功。

总结

Die Codequalität ist ein Problem, auf das jeder Entwickler achten muss. Die von golangci-lint bereitgestellte Reihe von Linter-Plug-Ins kann Gopher dabei helfen, potenzielle Fehler rechtzeitig zu erkennen und zu beheben großes Ausmaß. Gleichzeitig kann golangci-lint auch den Codestil innerhalb des Projektteams effektiv standardisieren und die mentale Belastung durch die Codeüberprüfung verringern. Ich hoffe, dass Gophers es effektiv nutzen kann.

Das Git-Commit-Tool generiert über die Konfigurationsdatei, was Git-Hooks benötigen<span style="font-size: 15px;letter-spacing: 1px;">pre-commit</span>pre-commit Hook-Skript, das statische Code-Inspektionsarbeiten durch golangci-lint von manuellen Aktionen in einen automatisierten Prozess umwandeln kann. Die obige Einführung in Git-Commit ist relativ einfach. Leser, die es genauer erkunden möchten, können direkt auf die offizielle Website https://pre-commit.com/index.html gehen. Tatsächlich können wir diesen automatisierten Prozess weiter ausbauen. Beispielsweise können wir Golangci-Lint-Regeln verwenden, um zu verhindern, dass nicht standardmäßiger Code aus dem Projekt in die lokale Codebasis übernommen wird. Dies kann zum Erreichen einer kontinuierlichen Integration erreicht werden Automatisierung. Aus Platzgründen bleibt die Nutzung des CI-Teils den Lesern selbst überlassen.

🎜

Das obige ist der detaillierte Inhalt vonCode-Automatisierungsinspektion, die Gopher kennen muss. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Go语言进阶学习. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen