Document installing/running/interpreting linters (#541)
Also minor documentation for import formatting expectations.
This commit is contained in:
parent
ea1cdcf119
commit
a43a98e8ad
92
docs/docs/developers/linters.md
Normal file
92
docs/docs/developers/linters.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
# Corso linters
|
||||||
|
|
||||||
|
Corso uses the golangci-lint GitHub action to run linters on every PR to `main`.
|
||||||
|
This helps reduce the cognitive load on reviewers and can lead to better
|
||||||
|
reviewer comments as they don’t get caught up with formatting issues.
|
||||||
|
|
||||||
|
## Installing golangci-lint locally
|
||||||
|
|
||||||
|
You can install a local version of the linter Corso uses on any platform and
|
||||||
|
there's also a docker container available. Instructions for installation are
|
||||||
|
available on the golangci-lint
|
||||||
|
[website](https://golangci-lint.run/usage/install/#local-installation). The
|
||||||
|
version that you install should match the version the GitHub workflow uses to
|
||||||
|
avoid failures even after running locally. The current version in use is
|
||||||
|
[denoted](https://github.com/alcionai/corso/blob/main/.github/workflows/lint.yml#L55)
|
||||||
|
in `.github/worflows/lint.yaml`.
|
||||||
|
|
||||||
|
## Running the linter
|
||||||
|
|
||||||
|
You can run the linter manually or with the Makefile in the repo. Running with
|
||||||
|
the Makefile will also ensure you have the proper version of golangci-lint
|
||||||
|
installed.
|
||||||
|
|
||||||
|
### Running with the Makefile
|
||||||
|
|
||||||
|
There’s a Makefile in the repo that will automatically check if the proper
|
||||||
|
golangci-lint version is installed and run it. This make rule can be run
|
||||||
|
with `make lint`. If golangci-lint isn't installed locally or the wrong version
|
||||||
|
is present it will tell you what version it expects and give a link to the
|
||||||
|
installation page.
|
||||||
|
|
||||||
|
### Running manually
|
||||||
|
|
||||||
|
You can run golangci-lint manually by executing `golangci-lint run` in the Corso
|
||||||
|
code directory. It will automatically use the `.golangci.yml` config file so it
|
||||||
|
executes with the same settings as the GitHub action.
|
||||||
|
|
||||||
|
## Adding exceptions for lint errors
|
||||||
|
|
||||||
|
Sometimes the linter will report an issue but it's not something that can or
|
||||||
|
should be fixed. In those cases there are two ways to add a linter exception.
|
||||||
|
|
||||||
|
### Single exception via comment
|
||||||
|
|
||||||
|
Adding a comment on the line before (or sometimes the offending line) with the
|
||||||
|
form `//nolint:<linter-name>` will ignore a single error. `<linter-name>` must
|
||||||
|
be replaced with the name of the linter that produced the report. Note there’s
|
||||||
|
no space between the `//` and `nolint`. Having a space between the two may
|
||||||
|
result in the linter still reporting that line.
|
||||||
|
|
||||||
|
### Global exception
|
||||||
|
|
||||||
|
The `golangci.yml` file has a list of issues that are ignored in the whole
|
||||||
|
project. These should be as targeted as possible to avoid silencing other lint
|
||||||
|
errors that are't related to the one in question. The golangci-lint
|
||||||
|
[issues configuration page](https://golangci-lint.run/usage/configuration/#issues-configuration)
|
||||||
|
has some information on this, but it's also useful to look at
|
||||||
|
[existing exceptions](https://github.com/alcionai/corso/blob/main/src/.golangci.yml)
|
||||||
|
in the repo under the `issues` section.
|
||||||
|
|
||||||
|
The config file allows for regex in the text property, so it’s useful to include
|
||||||
|
the linter/rule that triggered the message. This ensures the lint error is only
|
||||||
|
ignored for that linter. Combining the linter/rule with the error message text
|
||||||
|
specific to that error also helps avoid ignoring other lint errors.
|
||||||
|
|
||||||
|
## Interpreting linter output
|
||||||
|
|
||||||
|
Some linters have output messages that don't make clear what the issue is. The
|
||||||
|
following subsections give the version of golangci-lint that they apply to, the
|
||||||
|
linter in question, and give guidance on interpreting lint messages.
|
||||||
|
|
||||||
|
### gci `Expected 's', Found 'a' at file.go`
|
||||||
|
|
||||||
|
This applies to golangci-lint v1.45.2 for the gci linter and is due to an import
|
||||||
|
ordering issue. It occurs because imports in the file are't grouped according
|
||||||
|
to the import rules for Corso. Corso code should have three distinct import
|
||||||
|
groups, system imports, third party imports, and imports of other Corso code
|
||||||
|
like below. The most likely cause of a gci lint error is a Corso import in the
|
||||||
|
block for third party libraries.
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/kopia/kopia"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/pkg/selector"
|
||||||
|
)
|
||||||
Loading…
x
Reference in New Issue
Block a user