View Source .credo.exs
Credo is configured via a file called .credo.exs.
You can use mix credo gen.config to generate a complete example configuration.
$ mix credo gen.config
* creating .credo.exs
This file can live in your project's config/ or root folder, both is fine.
Config Keys
Credo's config is a plain .exs file, no magic here. It contains a map with a single key (:configs), which contains a list of maps that represent the individual configs (most of the time, it's just one, named "default").
# .credo.exs or config/.credo.exs
%{
configs: [
%{
name: "default",
files: %{
included: ["lib/", "src/", "web/", "apps/"],
excluded: []
},
plugins: [],
requires: [],
strict: false,
parse_timeout: 5000,
color: true,
checks: [
{Credo.Check.Design.AliasUsage, priority: :low},
# ... other checks omitted for readability ...
]
}
]
}The config keys available are:
:name
Credo configs are given names. The default configuration is named default.
You can specify which config to use on the command line (again, default is run by ... default):
mix credo --config-name <NAME_OF_CONFIG>
For example, say we have a directory lib/that_big_namespace with tons of issues and we do want to split our regular linting and the necessary clean up in that directory.
We can exclude the directory from our default config and add another config for just that directory.
# .credo.exs
%{
configs: [
%{
name: "default",
files: %{
included: ["lib/", "src/", "web/", "apps/"],
excluded: ["lib/that_big_namespace"]
}
},
%{
name: "spring-cleaning",
files: %{
included: ["lib/that_big_namespace"],
excluded: []
}
}
]
}Now you can use
mix credo --config-name spring-cleaning
to run the custom configuration we added.
:files
# .credo.exs
%{
configs: [
%{
name: "default",
files: %{
included: ["mix.exs", "lib/", "src/", "web/", "apps/"],
excluded: ["test/"]
},
# checks etc.
}
]
}The :files map can have two fields:
:includedcontains a list of files, directories and globs (as in"**/*_test.exs"):excludedcontains a list of files, directories, globs (as in"**/*_test.exs") and regular expressions (as in~r"/_build/")
:plugins
Configures plugin modules that Credo should load at start up (defaults to []).
This is needed to enable and configure plugins in the analysis.
# .credo.exs
%{
configs: [
%{
name: "default",
plugins: [
{CredoDemoPlugin, []}
],
# files, checks etc.
}
]
}All plugins are configured using a two-element tuple:
{MyApp.PluginModule, params}MyApp.PluginModule- the module representing the plugin to be configuredparams- can be eitherfalse(to disable the plugin) or a keyword list of parameters (to configure the plugin)
:requires
Configures Elixir source files that Credo should require at start up (defaults to []).
This is needed to add local custom checks in the analysis.
# .credo.exs
%{
configs: [
%{
name: "default",
requires: ["lib/check/my_check.ex"],
# files, checks etc.
}
]
}
:strict
Set to true to enable low priority checks (defaults to false).
This is equivalent to using the --strict CLI switch.
# .credo.exs
%{
configs: [
%{
name: "default",
strict: true,
# files, checks etc.
}
]
}
:parse_timeout
Configures a timeout for parsing source files in milliseconds (defaults to 5000 milliseconds).
# .credo.exs
%{
configs: [
%{
name: "default",
parse_timeout: 60_000,
# files, checks etc.
}
]
}
:color
Set to false to disable colored output (defaults to true).
This is equivalent to using the --no-color CLI switch.
# .credo.exs
%{
configs: [
%{
name: "default",
color: false,
# files, checks etc.
}
]
}
:checks
Configures check modules that Credo should load at start up (defaults to []).
# .credo.exs
%{
configs: [
%{
name: "default",
checks: [
{Credo.Check.Consistency.TabsOrSpaces, false},
{Credo.Check.Design.AliasUsage, if_nested_deeper_than: 2},
],
# files etc.
}
]
}Read more about check configuration and adding custom checks.
Using a specific configuration file
You can tell Credo to use a specific config file anywhere in the file system:
mix credo --config-file <PATH_TO_CONFIG_FILE>
Please note that when specifying a config file this way, only that config files contents are loaded. The "Transitive configuration files" mechanism described in the next section does not apply in this case.
Transitive configuration files
Credo traverses the filesystem's folder structure upwards to find additional config files which it applies to the current project.
Consider the following directory structure:
/
home/
rrrene/
projects/
foo/
.credo.exs
bar/
.credo.exs
In this example, there is a Credo config file in my home folder and one in my project.
For project foo/, the contents of /home/rrrene/projects/foo/.credo.exs are merged with the settings in /home/rrrene/.credo.exs and Credo's default config.
For project bar/, the contents of /home/rrrene/.credo.exs and Credo's default config are relevant.
Please note that, as mentioned above, Credo's config can also reside in a config/ subdirectory at every step of the way.
Given this directory structure:
/
home/
rrrene/
config/
.credo.exs
projects/
bar/
foo/
config/
.credo.exs
For project foo/, the contents of /home/rrrene/projects/foo/config/.credo.exs are merged with the settings in /home/rrrene/config/.credo.exs and Credo's default config.
This works great for umbrella projects, where you can have individual .credo.exs files for each app and/or a global one in the umbrella's config/ or root folder.
This way, you can enable/disable settings on a per-app basis.