Table des matières
使用方式:" >使用方式:
1. 项目中已经存在这些内容" >1. 项目中已经存在这些内容
2. 新建项目这个怎么搞" >2. 新建项目这个怎么搞
Maison développement back-end Golang application golangci-lint

application golangci-lint

Aug 04, 2023 pm 05:03 PM
go golangci-lint

Qu'est-ce que golangci-lint ?

golangci-lint est un agrégateur Go linters, tandis que linter utilise des outils pour fournir des vérifications sur le code afin de garantir la qualité du code soumis. golangci-lint 是一个 Go linters 聚合器,而 linter 是使用工具来对代码提供一些检查,保证提交代码的质量。

为什么不直接使用 golangci-lint ?

需要手动执行,在之前使用的过程中,由于项目是多人活动,总是会忘记执行golangci-lint 进行代码检查,当前我自己也是。所以我们希望采用一种隐式的方式来自动执行。那么经过多番思考,采用 git 的 hooks 可以来自动执行一些脚本。

这期间还有一些其他的尝试,不过这个文章主要说 在git中的使用ci-lint,有兴趣的可以移步到为什么最终采用git 本地 hooks 的方式执行golangci-lint?

采用 git 的 hooks 来自动执行检查!

前提条件

请设置 goland 的默认终端为 bash,不然后面执行脚本的时候,可能会不支持。

application golangci-lint

由于现在采用 git 作为我们的版本管理系统(VCS),而git

Pourquoi ne pas utiliser golangci-lint directement ?🎜🎜Il doit être exécuté manuellement lors du processus d'utilisation précédente, puisque le projet est une activité à plusieurs personnes, j'oublie toujours de l'exécutergolangci-lint pour la vérification du code, actuellement moi-même. Nous souhaitons donc utiliser un moyen implicite pour l'exécuter automatiquement. Ainsi, après mûre réflexion, nous pouvons utiliser des hooks git pour exécuter automatiquement certains scripts. 🎜🎜Il y a eu quelques autres tentatives au cours de cette période, mais cet article parle principalement de Utilisation de ci-lint dans git Ceux qui sont intéressés peuvent passer à la raison pour laquelle les hooks locaux de git sont finalement utilisés pour exécuter golangci-. peluche? 🎜🎜🎜🎜Utilisez les git hooks pour effectuer automatiquement des vérifications ! 🎜🎜Prérequis : 🎜🎜Veuillez définir le terminal par défaut de Goland sur bash, sinon il risque de ne pas être pris en charge lorsque le script est exécuté ultérieurement. 🎜
🎜Depuis que nous utilisons désormais git comme système de gestion de versions ( VCS ), tandis que git Autorise l'exécution du script avant d'effectuer certaines opérations, ce qui nous permet d'effectuer des vérifications de code avant certaines opérations. 🎜🎜Répertoire des codes de projet : 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>├── .githooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── fsmonitor-watchman.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit │ ├── pre-merge-commit.sample │ ├── pre-push │ ├── pre-rebase.sample │ ├── pre-receive.sample │ ├── prepare-commit-msg.sample │ ├── push-to-checkout.sample │ └── update.sample ├── .golangci.yml ├── go.mod ├── golangci-lint.sh └── init.sh</pre><div class="contentsignin">Copier après la connexion</div></div><ol class="list-paddingleft-1" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;"><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><p style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;"> peut être vu à travers la structure du projet. Vous devez ajouter un <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin in. le répertoire racine du projet -droite : 2px;marge-gauche : 2px;couleur : rgb(30, 107, 184);couleur d'arrière-plan : rgba(27, 31, 35, 0.05);famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">.githooks dossier, .githooks 文件夹,

  • 然后增加 .golangci.yml golangci-lint 使用的配置文件,

  • 增加一个 手动执行goalngci-lint的执行脚本golangci-lint.sh

  • 最后就是项目应用 git hooks 的脚本init.sh,用于初始化这个项目的脚本。

  • 说了这么多,还不知道这个到底是干啥的,先来看一下效果图

    commit的时候会帮助我们进行文件的 fmt:

    application golangci-lint

    push

    🎜🎜 puis ajoutez .golangci.yml Fichier de configuration utilisé par golangci- lint, 🎜< /section>🎜🎜🎜Ajouter une exécution manuellegoalngci-lint's script d'exécutiongolangci-lint.sh, 🎜🎜🎜🎜Le dernier est l'application du projetgit hooks scriptinit.sh< /code>, utilisé pour initialiser ce script de projet. 🎜</section></li></ol><p data-tool="mdnice editor" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">C'est tout, Je ne sais toujours pas à quoi ça sert, regardons d'abord les rendus🎜<p data-tool="mdnice editor" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px ;">Dans<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb( 30, 107, 184);couleur d'arrière-plan : rgba(27, 31, 35, 0.05);famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace;saut de mot : break-all ;">commit nous aidera avec le fichier fmt:🎜
    application golangci-lint

    InLorsque vous appuyez, l'ensemble du projet sera vérifié pour voir s'il y a des problèmes : 🎜

    application golangci-lint

    如果项目存在可能的问题,那么是不会让你 push 的。通过这种方式来保证服务器上的代码都是符合规则的。

    使用方式:

    1. 项目中已经存在这些内容

    首次通过执行 init.sh 脚本进行项目初始化设置。

    application golangci-lint

    这会检查你的环境,如果一些工具不存在,它会自动下载。并会修改默认 git 钩子指向当前项目的 .githooks 文件夹。

    好了,就这样,就是这么简单。

    2. 新建项目这个怎么搞

    这都是小问题,复制内容过去吧。

    但是在复制这些之前,你一定已经是在一个git 管理的根目录下。

    那么下面就开始你的复制吧。

    .githooks/pre-commit:

    #!/bin/sh
    #
    # An example hook script to verify what is about to be committed.
    # Called by "git commit" with no arguments.  The hook should
    # exit with non-zero status after issuing an appropriate message if
    # it wants to stop the commit.
    #
    # To enable this hook, rename this file to "pre-commit".
    
    # 获取所有变化的go文件
    STAGED_GO_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep .go$)
    
    if [ "$STAGED_GO_FILES" = "" ]; then
        exit 0
    fi
    
    echo "check gofmt ..."
    CHECK_FMT=$(gofmt -s -w -l $STAGED_GO_FILES)
    if [ -n "${CHECK_FMT##* }" ]; then
        echo
        echo -e "these files will be\033[32m gofmt\033[0m formatted:"
        for file in ${CHECK_FMT[*]}; do
            echo -e "\033[36m\t$file\033[0m"
        done
        git add ${CHECK_FMT//\/n/ }
        echo
    fi
    
    echo "check goimports ..."
    CHECK_GOPLS=$(goimports -l -w $STAGED_GO_FILES)
    if [ -n "${CHECK_GOPLS##* }" ]; then
        echo
        echo -e "these files will be\033[32m goimports\033[0m formatted:"
        for file in ${CHECK_GOPLS[*]}; do
            echo -e "\033[36m\t$file\033[0m"
        done
        git add ${CHECK_GOPLS//\/n/ }
        echo
    fi
    
    printf "\033[32m COMMIT SUCCEEDED \033[0m\n"
    echo
    
    exit 0
    Copier après la connexion

    .githooks/pre-push:

    #!/bin/sh
    
    # An example hook script to verify what is about to be pushed.  Called by "git
    # push" after it has checked the remote status, but before anything has been
    # pushed.  If this script exits with a non-zero status nothing will be pushed.
    #
    # This hook is called with the following parameters:
    #
    # $1 -- Name of the remote to which the push is being done
    # $2 -- URL to which the push is being done
    #
    # If pushing without using a named remote those arguments will be equal.
    #
    # Information about the commits which are being pushed is supplied as lines to
    # the standard input in the form:
    #
    #   <local ref> <local oid> <remote ref> <remote oid>
    #
    # This sample shows how to prevent push of commits where the log message starts
    # with "WIP" (work in progress).
    
    #remote="$1"
    #url="$2"
    printf "\033[32m 推送前需要检查当前项目可以 go build 通过 \033[0m\n"
    
    echo "run golangci-lint..."
    echo
    
    # 运行 golangci-lint 检查工具
    golangci-lint run ./...
    if [ $? -ne 0 ]; then
        printf "\033[31m PUSH FAILED \033[0m\n"
        exit 1
    fi
    
    printf "\033[32m PUSH SUCCEEDED \033[0m\n"
    echo
    
    exit 0
    Copier après la connexion

    golangci-lint.sh

    #!/bin/sh
    
    if ! command -v golangci-lint &>/dev/null; then
        echo "golangci-lint not installed or available in the PATH" >&2
        echo "install golangci-lint ..." >&2
        go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
    fi
    
    #goland 可直接定位文件
    golangci-lint run ./... |sed &#39;s/\\/\//g&#39;
    Copier après la connexion

    init.sh

    #!/bin/sh
    
    # 检查 go 是否安装
    checkGoEnv() {
        # go是否安装
        if ! command -v go &>/dev/null; then
            echo "go not installed or available in the PATH" >&2
            echo "please check https://golang.google.cn" >&2
            exit 1
        fi
    
        # go proxy 是否设置
        if [ -z $GOPROXY ]; then
            echo "go proxy not set in the PATH" >&2
            echo "please set GOPROXY, https://goproxy.cn,direct || https://goproxy.io,direct" >&2
            exit 1
        fi
    
        echo "go env installed ..."
    }
    
    # 检查 go 相关工具包是否安装
    checkGoLintEnv() {
        if ! command -v goimports &>/dev/null; then
            echo "goimports not installed or available in the PATH" >&2
            echo "install goimports ..." >&2
            go install golang.org/x/tools/cmd/goimports@latest
            checkGoLintEnv
            return
        fi
    
        echo "goimports installed ..."
    }
    
    # 检查 golangci-lint 是否安装
    checkCiLintEnv() {
        if ! command -v golangci-lint &>/dev/null; then
            echo "golangci-lint not installed or available in the PATH" >&2
            echo "install golangci-lint ..." >&2
            go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
            checkCiLintEnv
        fi
    
        echo "golangci-lint installed ..."
    }
    
    # 初始化钩子配置
    initHooks() {
        # 如果当前目录不存在 .githooks 目录,说明位置不对
        if [ ! -d ".githooks" ]; then
            echo "exec incorrect position"
            exit 1
        fi
    
        # 检查是否已经设置了
        exist=$(git config core.hooksPath)
        if [ -z $exist ]; then
            # 设置 hooks 默认位置
            git config core.hooksPath .githooks
            echo "init git hooks ..." >&2
        fi
    }
    
    main() {
        checkGoEnv
        checkGoLintEnv
        checkCiLintEnv
        initHooks
    }
    
    main
    Copier après la connexion

    .golangci.yml

    run:
      timeout: 2m
      tests: false
    
    linters:
      disable-all: true
      enable:
        - typecheck
        - staticcheck
        - govet
        - gocritic
    
    linters-settings:
      govet:
        check-shadowing: true
        disable-all: true
        enable:
          - asmdecl
          - assign
          - atomic
          - atomicalign
          - bools
          - buildtag
          - cgocall
          - composites
          - copylocks
          - httpresponse
          - loopclosure
          - lostcancel
          - nilfunc
          - nilness
          - printf
          - shadow
          - shift
          - stdmethods
          - structtag
          - tests
          - unmarshal
          - unreachable
          - unsafeptr
          - unusedresult
    
      staticcheck:
        go: "1.17"
        checks: [ "all", "-SA3*", "-SA6000", "-SA6001", "-SA6003", "-ST*", "ST1006", "ST1008", "ST1016", "-QF1" ]
    
      gocritic:
        enabled-tags:
          - diagnostic
          - experimental
          - opinionated
          - style
        enabled-checks:
          - sliceClear
        disabled-tags:
          - performance
        disabled-checks:
          - assignOp
          - badLock
          - badRegexp
          - codegenComment
          - commentFormatting
          - commentedOutCode
          - docStub
          - dupArg
          - dupBranchBody
          - dupCase
          - dupImport
          - exitAfterDefer
          - externalErrorReassign
          - flagDeref
          - hexLiteral
          - ifElseChain
          - importShadow
          - initClause
          - mapKey
          - nestingReduce
          - newDeref
          - redundantSprint
          - regexpMust
          - regexpPattern
          - regexpSimplify
          - ruleguard
          - sloppyLen
          - sloppyTypeAssert
          - sortSlice
          - sprintfQuotedString
          - sqlQuery
          - stringConcatSimplify
          - syncMapLoadAndDelete
          - tooManyResultsChecker
          - typeDefFirst
          - typeUnparen
          - underef
          - unlabelStmt
          - unlambda
          - unnecessaryBlock
          - unnecessaryDefer
          - yodaStyleExpr
          - whyNoLint
          - paramTypeCombine
          - emptyStringTest
    Copier après la connexion

    好了,现在你应该是这样的结构了吧

    项目代码目录:

    ├── .githooks
    │   ├── pre-commit
    │   └── pre-push
    ├── .golangci.yml
    ├── golangci-lint.sh
    └── init.sh
    Copier après la connexion

    如果不是,请返回到上面在看一下步骤。

    这个时候可以执行 init.sh 脚本来初始化了。

    Enfin, vous pouvez obtenir le code dans l'https://github.com/ywanbing/golangcientrepôt.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    Video Face Swap

    Video Face Swap

    Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Comment envoyer des messages Go WebSocket ? Comment envoyer des messages Go WebSocket ? Jun 03, 2024 pm 04:53 PM

    Dans Go, les messages WebSocket peuvent être envoyés à l'aide du package gorilla/websocket. Étapes spécifiques : Établissez une connexion WebSocket. Envoyer un message texte : appelez WriteMessage(websocket.TextMessage,[]byte("message")). Envoyez un message binaire : appelez WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}).

    Compréhension approfondie du cycle de vie des fonctions Golang et de la portée variable Compréhension approfondie du cycle de vie des fonctions Golang et de la portée variable Apr 19, 2024 am 11:42 AM

    Dans Go, le cycle de vie de la fonction comprend la définition, le chargement, la liaison, l'initialisation, l'appel et le retour ; la portée des variables est divisée en niveau de fonction et au niveau du bloc. Les variables d'une fonction sont visibles en interne, tandis que les variables d'un bloc ne sont visibles que dans le bloc. .

    Comment faire correspondre les horodatages à l'aide d'expressions régulières dans Go ? Comment faire correspondre les horodatages à l'aide d'expressions régulières dans Go ? Jun 02, 2024 am 09:00 AM

    Dans Go, vous pouvez utiliser des expressions régulières pour faire correspondre les horodatages : compilez une chaîne d'expression régulière, telle que celle utilisée pour faire correspondre les horodatages ISO8601 : ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Utilisez la fonction regexp.MatchString pour vérifier si une chaîne correspond à une expression régulière.

    La différence entre la langue Golang et Go La différence entre la langue Golang et Go May 31, 2024 pm 08:10 PM

    Go et le langage Go sont des entités différentes avec des caractéristiques différentes. Go (également connu sous le nom de Golang) est connu pour sa concurrence, sa vitesse de compilation rapide, sa gestion de la mémoire et ses avantages multiplateformes. Les inconvénients du langage Go incluent un écosystème moins riche que les autres langages, une syntaxe plus stricte et un manque de typage dynamique.

    Comment éviter les fuites de mémoire dans l'optimisation des performances techniques de Golang ? Comment éviter les fuites de mémoire dans l'optimisation des performances techniques de Golang ? Jun 04, 2024 pm 12:27 PM

    Les fuites de mémoire peuvent entraîner une augmentation continue de la mémoire du programme Go en : fermant les ressources qui ne sont plus utilisées, telles que les fichiers, les connexions réseau et les connexions à la base de données. Utilisez des références faibles pour éviter les fuites de mémoire et ciblez les objets pour le garbage collection lorsqu'ils ne sont plus fortement référencés. En utilisant go coroutine, la mémoire de la pile de coroutines sera automatiquement libérée à la sortie pour éviter les fuites de mémoire.

    Comment afficher la documentation des fonctions Golang dans l'EDI ? Comment afficher la documentation des fonctions Golang dans l'EDI ? Apr 18, 2024 pm 03:06 PM

    Consultez la documentation de la fonction Go à l'aide de l'EDI : passez le curseur sur le nom de la fonction. Appuyez sur la touche de raccourci (GoLand : Ctrl+Q ; VSCode : Après avoir installé GoExtensionPack, F1 et sélectionnez « Go:ShowDocumentation »).

    Un guide pour les tests unitaires des fonctions simultanées Go Un guide pour les tests unitaires des fonctions simultanées Go May 03, 2024 am 10:54 AM

    Les tests unitaires des fonctions simultanées sont essentiels car cela permet de garantir leur comportement correct dans un environnement simultané. Des principes fondamentaux tels que l'exclusion mutuelle, la synchronisation et l'isolement doivent être pris en compte lors du test de fonctions concurrentes. Les fonctions simultanées peuvent être testées unitairement en simulant, en testant les conditions de concurrence et en vérifiant les résultats.

    Choses à noter lorsque les fonctions Golang reçoivent des paramètres de carte Choses à noter lorsque les fonctions Golang reçoivent des paramètres de carte Jun 04, 2024 am 10:31 AM

    Lors du passage d'une carte à une fonction dans Go, une copie sera créée par défaut et les modifications apportées à la copie n'affecteront pas la carte d'origine. Si vous devez modifier la carte originale, vous pouvez la passer via un pointeur. Les cartes vides doivent être manipulées avec précaution, car ce sont techniquement des pointeurs nuls, et passer une carte vide à une fonction qui attend une carte non vide provoquera une erreur.

    See all articles