Scala has a quite rich build ecosystem, and a myriad of tools to help you writ good code. However, the build system(s) are relatively slow, so any helpers executed via those build system run the risk of interrupting the flow of a developer.
Moreover, some of the code quality tools/features (like unused import checks) are actively in opposition to a "run-often" coding approach.
Moving relevant checks to the pre-commit/pre-push phases partially alleviates those two issues.
This is a set of hooks defined in the excellent pre-commit library.
Currently, they include the following:
-
sbt-fatal-warnings
- turns on-Xfatal-warnings
, runs a clean compilation on the given scope. -
sbt-unused-imports
- as above, but also adds the "unused imports" warning. -
scalafmt-check
- runsscalafmt --mode=changed --test
. -
scalfmt-autofix
- runsscalafmt --mode=changed
and automatically stages the reformatted files.
Note1: All hooks except for scalafmt-*
have the optional scope
argument, which allows to define what source scopes are relevant for the hook’s check. The default is {defaultScope}
.
Note2: scalafmt-*
hooks require [scalafmt-cli
to be installed](https://scalameta.org/scalafmt/docs/installation.html#cli).
To add one or more of the hooks into your repo:
-
Have everyone on your team install pre-commit
-
Install
scalafmt-cli
forscalafmt-
hooks: https://scalameta.org/scalafmt/docs/installation.html#cli -
Add a
.pre-commit-config.yaml
file to your repository, with the following syntax:.pre-commit-config.yaml# See https://pre-commit.com/hooks.html for more hooks # See https://pre-commit.com for more information repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.1.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - repo: https://github.com/dixahq/scala-pre-commit-hooks hooks: rev: {currentVersion} - id: sbt-fatal-warnings stages: [push] # or [commit, push] etc. - id: scalafmt-check
-
Run
pre-commit install
to apply your hooks to the repo.