Module Plugin System

Tip

An example linter can be found at here.

The Automatic Way

  • Define your building configuration into .custom-gcl.yml.
  • Run the command golangci-lint custom (or golangci-lint custom -v to have logs).
  • Define the plugin inside the linters.settings.custom section with the type module.
  • Run the resulting custom binary of golangci-lint (./custom-gcl by default).

Requirements:

  • Go
  • git

Configuration Example

.custom-gcl.yml
version: v2.4.0
plugins:
  # a plugin from a Go proxy
  - module: 'github.com/golangci/plugin1'
    import: 'github.com/golangci/plugin1/foo'
    version: v1.0.0

  # a plugin from local source
  - module: 'github.com/golangci/plugin2'
    path: /my/local/path/plugin2
.golangci.yml
version: "2"

linters:
  default: none
  enable:
    - foo
  settings:
    custom:
      foo:
        type: "module"
        description: This is an example usage of a plugin linter.
        settings:
          message: hello

The Manual Way

  • Add a blank-import of your module inside cmd/golangci-lint/plugins.go.
  • Run go mod tidy (the module containing the plugin will be imported).
  • Run make build.
  • Define the plugin inside the linters.settings.custom section with the type module.
  • Run your custom version of golangci-lint.

Configuration Example

.golangci.yml
version: "2"

linters:
  default: none
  enable:
    - foo
  settings:
    custom:
      foo:
        type: "module"
        description: This is an example usage of a plugin linter.
        settings:
          message: hello

Reference

The configuration file can be validated with the JSON Schema: custom-gcl.jsonschema.json

.custom-gcl.yml
# The golangci-lint version used to build the custom binary.
# Required.
version: v2.0.0

# The name of the custom binary.
# Optional.
# Default: custom-gcl
name: custom-golangci-lint

# The directory path used to store the custom binary.
# Optional.
# Default: .
destination: ./my/path/

# The list of the plugins to integrate inside the custom binary.
plugins:
  # a plugin from a Go proxy
  - module: 'github.com/example/plugin3'
    version: v1.2.3

  # a plugin from a Go proxy (with a specific import path)
  - module: 'github.com/example/plugin4'
    import: 'github.com/example/plugin4/foo'
    version: v1.0.0

  # a plugin from local source (with absolute path)
  - module: 'github.com/example/plugin2'
    path: /my/local/path/plugin2

  # a plugin from local source (with relative path)
  - module: 'github.com/example/plugin1'
    path: ./my/local/path/plugin1

  # a plugin from local source (with absolute path and a specific import path)
  - module: 'github.com/example/plugin2'
    import: 'github.com/example/plugin4/foo'
    path: /my/local/path/plugin2
Last updated on