mirror of
https://github.com/nerdypepper/statix.git
synced 2024-08-17 09:20:34 +03:00
155 lines
3.3 KiB
Markdown
155 lines
3.3 KiB
Markdown
# statix
|
|
|
|
> Lints and suggestions for the Nix programming language.
|
|
|
|
`statix check` highlights antipatterns in Nix code. `statix
|
|
fix` can fix several such occurrences.
|
|
|
|
For the time-being, `statix` works only with ASTs
|
|
produced by the `rnix-parser` crate and does not evaluate
|
|
any nix code (imports, attr sets etc.).
|
|
|
|
## Examples
|
|
|
|
```shell
|
|
$ statix check tests/c.nix
|
|
[W04] Warning: Assignment instead of inherit from
|
|
╭─[tests/c.nix:2:3]
|
|
│
|
|
2 │ mtl = pkgs.haskellPackages.mtl;
|
|
· ───────────────┬───────────────
|
|
· ╰───────────────── This assignment is better written with inherit
|
|
───╯
|
|
|
|
$ statix fix --dry-run tests/c.nix
|
|
--- tests/c.nix
|
|
+++ tests/c.nix [fixed]
|
|
@@ -1,6 +1,6 @@
|
|
let
|
|
- mtl = pkgs.haskellPackages.mtl;
|
|
+ inherit (pkgs.haskellPackages) mtl;
|
|
in
|
|
null
|
|
```
|
|
|
|
## Installation
|
|
|
|
`statix` is available via a nix flake:
|
|
|
|
```shell
|
|
# build from source
|
|
nix build git+https://git.peppe.rs/languages/statix
|
|
./result/bin/statix --help
|
|
|
|
# statix also provides a flake app
|
|
nix run git+https://git.peppe.rs/languages/statix -- --help
|
|
|
|
# save time on builds using cachix
|
|
cachix use statix
|
|
```
|
|
|
|
Install from nixpkgs:
|
|
|
|
```shell
|
|
nix run nixpkgs#statix -- help
|
|
```
|
|
|
|
Install with [brew/linuxbrew](https://brew.sh)
|
|
|
|
```bash
|
|
brew install statix
|
|
```
|
|
|
|
## Usage
|
|
|
|
Basic usage is as simple as:
|
|
|
|
```shell
|
|
# recursively finds nix files and raises lints
|
|
statix check /path/to/dir
|
|
|
|
# ignore generated files, such as Cargo.nix
|
|
statix check /path/to/dir -i Cargo.nix
|
|
|
|
# ignore more than one file
|
|
statix check /path/to/dir -i a.nix b.nix c.nix
|
|
|
|
# ignore an entire directory
|
|
statix check /path/to/dir -i .direnv
|
|
|
|
# statix respects your .gitignore if it exists
|
|
# run statix in "unrestricted" mode, to disable that
|
|
statix check /path/to/dir -u
|
|
|
|
# see `statix -h` for a full list of options
|
|
```
|
|
|
|
Certain lints have suggestions. Apply suggestions back to
|
|
the source with:
|
|
|
|
```shell
|
|
statix fix /path/to/file
|
|
|
|
# show diff, do not write to file
|
|
statix fix --dry-run /path/to/file
|
|
```
|
|
|
|
`statix` supports a variety of output formats; standard,
|
|
json and errfmt:
|
|
|
|
```shell
|
|
statix check /path/to/dir -o json # only when compiled with --all-features
|
|
statix check /path/to/dir -o errfmt # singleline, easy to integrate with vim
|
|
```
|
|
|
|
### Configuration
|
|
|
|
Ignore lints and fixes by creating a `statix.toml` file at
|
|
your project root:
|
|
|
|
```
|
|
# within statix.toml
|
|
disabled = [
|
|
"empty_pattern"
|
|
]
|
|
```
|
|
|
|
`statix` automatically discovers the configuration file by
|
|
traversing parents of the current directory and looking for
|
|
a `statix.toml` file. Alternatively, you can pass the path
|
|
to the `statix.toml` file on the command line with the
|
|
`--config` flag (available on `statix check` and `statix
|
|
fix`).
|
|
|
|
The available lints are (see `statix list` for an updated
|
|
list):
|
|
|
|
```
|
|
bool_comparison
|
|
empty_let_in
|
|
manual_inherit
|
|
manual_inherit_from
|
|
legacy_let_syntax
|
|
collapsible_let_in
|
|
eta_reduction
|
|
useless_parens
|
|
empty_pattern
|
|
redundant_pattern_bind
|
|
unquoted_uri
|
|
deprecated_is_null
|
|
empty_inherit
|
|
faster_groupby
|
|
faster_zipattrswith
|
|
deprecated_to_path
|
|
bool_simplification
|
|
useless_has_attr
|
|
```
|
|
|
|
All lints are enabled by default. Generate a minimal config
|
|
with `statix dump > statix.toml`.
|
|
|
|
## TODO
|
|
|
|
- Resolve imports and scopes for better lints
|
|
- Add silent flag that exits with status
|