#nix #unused #dead #variables #bindings #find #scan

bin+lib deadnix

在 Nix 项目中查找未使用代码

13 个版本 (4 个稳定版)

1.2.1 2023 年 10 月 31 日
1.2.0 2023 年 4 月 29 日
1.0.0 2022 年 10 月 12 日
0.1.8 2022 年 9 月 13 日
0.1.1 2021 年 12 月 11 日

#233 in Unix API

每月下载 38 次

GPL-3.0-or-later

57KB
1.5K SLoC

deadnix

扫描 .nix 文件以查找未使用代码(未使用的变量绑定)。

与 Github Actions 一起使用

查看 deadnix-action

与 Nix Flakes 一起使用

帮助

$ nix run github:astro/deadnix -- --help
Find dead code in .nix files

Usage: deadnix [OPTIONS] [FILE_PATHS]...

Arguments:
  [FILE_PATHS]...  .nix files, or directories with .nix files inside [default: .]

Options:
  -l, --no-lambda-arg                  Don't check lambda parameter arguments
  -L, --no-lambda-pattern-names        Don't check lambda attrset pattern names (don't break nixpkgs callPackage)
  -_, --no-underscore                  Don't check any bindings that start with a _
  -q, --quiet                          Don't print dead code report
  -e, --edit                           Remove unused code and write to source file
  -h, --hidden                         Recurse into hidden subdirectories and process hidden .*.nix files
      --help
  -f, --fail                           Exit with 1 if unused code has been found
  -o, --output-format <OUTPUT_FORMAT>  Output format to use [default: human-readable] [possible values: human-readable, json]
      --exclude <EXCLUDES>...          Files to exclude from analysis
  -V, --version                        Print version

除非设置了 $NO_COLOR 环境变量,否则报告将包含 ANSI 颜色转义代码。

--exclude 参数接受多个路径。使用 -- 分隔它们以传递 [FILE_PATHS]...

扫描未使用代码

$ nix run github:astro/deadnix example.nix
Warning: Unused declarations were found.
    ╭─[example.nix:1:1]
  1 │unusedArgs@{ unusedArg, usedArg, ... }:
    ·     │           ╰───── Unused lambda pattern: unusedArg
    ·     ╰───────────────── Unused lambda pattern: unusedArgs
  3 │  inherit (builtins) unused_inherit;
    ·                            ╰─────── Unused let binding: unused_inherit
  5 │  unused = "fnord";
    ·     ╰─── Unused let binding: unused
 10 │  shadowed = 42;
    ·      ╰──── Unused let binding: shadowed
 11 │  _unused = unused: false;
    ·     │         ╰─── Unused lambda argument: unused
    ·     ╰───────────── Unused let binding: _unused
 13 │  x = { unusedArg2, x ? args.y, ... }@args: used1 + x;
    ·             ╰───── Unused lambda pattern: unusedArg2

自动删除未使用代码

在提交更改到版本控制 之前!

$ nix run github:astro/deadnix -- -eq test.nix

pre-commit 一起使用

将以下内容添加到项目 .pre-commit-config.yaml

repos:
  - repo: https://github.com/astro/deadnix
    rev: ID # frozen: VERSION
    hooks:
      - id: deadnix
        #args: [--edit] # Uncomment to automatically modify files
        stages: [commit]

将上面的 IDVERSION 替换为相关版本标签和提交 ID 以供参考,例如

rev: da39a3ee5e6b4b0d3255bfef95601890afd80709  # frozen: v1.2.3

行为

将所有未使用的重命名为以 _ 开头的 lambda 参数

如果您不希望标记它们为未使用,请使用选项 -l/--no-lambda-arg

nixpkgs callPackages 具有多个导入

callPackages 通过包的 lambda attrset 模式名称猜测要注入的包。一些包使用 @args 将它们别名为传递给另一个 import ...nix args

由于使用的参数仅在导入的文件中命名,它们在通过 callPackage 导入的包源文件中将被视为无效,导致无法猜测调用包的依赖项。

在这种情况下,请使用选项 -L/--no-lambda-pattern-names

跳过某些声明的报告

从 1.1.0 版本开始,deadenix 支持以下预处理指令来跳过以下行中绑定的检查

# deadnix: skip

如果生成的报告有误怎么办?

请提交一个 issue。不要忘记包括产生错误结果的 .nix 代码。

商业支持

作者可以被雇佣来实现您希望的功能,或者将此工具集成到您的工具链中。

依赖项

~2.4–10MB
~71K SLoC