A Go linter that checks package imports are in a list of acceptable packages. This allows you to allow imports from a whole organization or only allow specific packages within a repository.
go get github.com/OpenPeeDeeP/depguard/v2The Depguard binary looks for a file named ^\.?depguard\.(yaml|yml|json|toml)$ in the current
current working directory. Examples include (.depguard.yml or depguard.toml).
The following is an example configuration file.
{
"main": {
"files": [
"$all",
"!$test"
],
"allow": [
"$gostd",
"github.com/OpenPeeDeeP"
],
"deny": {
"reflect": "Who needs reflection",
}
},
"tests": {
"files": [
"$test"
],
"deny": {
"github.com/stretchr/testify": "Please use standard library for tests"
}
}
}- The top level is a map of lists. The key of the map is a name that shows up in the linter's output.
files- list of file globs that will match this list of settings to compare againstallow- list of allowed packagesdeny- map of packages that are not allowed where the value is a suggestion
Files are matched using Globs. If the files
list is empty, then all files will match that list. Prefixing a file
with an exclamation mark ! will put that glob in a "don't match" list. A file
will match a list if it is allowed and not denied.
Should always prefix a file glob with
**/as files are matched against absolute paths.
Allow is a prefix of packages to allow. A dollar sign $ can be used at the end
of a package to specify it must be exact match only.
Deny is a map where the key is a prefix of the package to deny, and the value
is a suggestion on what to use instead. A dollar sign $ can be used at the end
of a package to specify it must be exact match only.
A Prefix List just means that a package will match a value, if the value is a
prefix of the package. Example github.com/OpenPeeDeeP/depguard package will match
a value of github.com/OpenPeeDeeP but won't match github.com/OpenPeeDeeP/depguard/v2.
There are variable replacements for each type of list (file or package). This is to reduce repetition and tedious behaviors.
you can still use and exclamation mark
!in front of a variable to say not to use it. Example!$testwill match any file that is not a go test file.
$all- matches all go files$test- matches all go test files
$gostd- matches all of go's standard library (Pulled from GOROOT)
Below:
- non-test go files will match
Mainand test go files will matchTest. - both allow all of go standard library except for the
reflectpackage which will tell the user "Please don't use reflect package". - go test files are also allowed to use https://github.com/stretchr/testify package and any sub-package of it.
Main:
files:
- $all
- "!$test"
allow:
- $gostd
deny:
reflect: Please don't use reflect package
Test:
files:
- $test
allow:
- $gostd
- github.com/stretchr/testify
deny:
reflect: Please don't use reflect packageBelow:
- All go files will match
Main - Go files in internal will match both
MainandInternal
Main:
files:
- $all
Internal:
files:
- "**/internal/**/*.go"Below:
- All packages are allowed except for
github.com/OpenPeeDeeP/depguard. Thoughgithub.com/OpenPeeDeeP/depguard/v2andgithub.com/OpenPeeDeeP/depguard/somepackagewould be allowed.
Main:
deny:
- github.com/OpenPeeDeeP/depguard$This linter was built with Golangci-lint in mind. It is compatible and read their docs to see how to implement all their linters, including this one.