📝

フォーマッターが増えてきたのでTreefmtを試してみた

に公開

Treefmt とは

まずtreefmt の目的はリポジトリで以下のように説明されています。

treefmt streamlines the process of applying formatters to your project, making it a breeze with just one command line.

treefmtはプロジェクトへのフォーマッタ適用プロセスを合理化し、たった1つのコマンドラインで簡単に実行できるようにします。

numtide/treefmt

このツールが提供する主な機能は以下の通りです。

  • 設定ファイルでフォーマッタを指定すると、1つのコマンドですべてを実行し、標準化された出力を得ることができます。
  • treefmtはフォーマッタを並列に実行します。
  • treefmtはファイルの変更を追跡し、変更されたファイルのみをフォーマットしようと試みます。

インストール方法

treefmt は go または nix を使ってインストールします。ここでは nix を使ったインストール方法を記載します。nix を使ったインストールでも、パッケージの新しい管理方法であるFlakeを使わない場合と使う場合の2つの方法があります。

非Nix-Flakes ユーザー

まず Flake を使わない場合は、nix-build を使うことでインストールできます。

nix-build -A packages.x86_64-linux.treefmt

Nix-Flake ユーザー

Flakeを使う場合は、プロジェクトルートの flake.nix の inputs と outputs を適切に設定する

{
  description = "my project";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    treefmt-nix.url = "github:numtide/treefmt-nix";
    systems.url = "github:nix-systems/default";
  };

  outputs = { self, nixpkgs, treefmt-nix, systems, ... }:
    let
      eachSystem = f: nixpkgs.lib.genAttrs (import systems)
        (system: f nixpkgs.legacyPackages.${system});

      treefmtEval = eachSystem (pkgs: treefmt-nix.lib.evalModule pkgs ./treefmt.nix);
    in
    {
      # これがあると `nix fmt` が動く
      formatter = eachSystem (pkgs: treefmtEval.${pkgs.system}.config.build.wrapper);

      # これがあると `nix flake check` で整形チェックできる(CI向け)
      checks = eachSystem (pkgs: {
        formatting = treefmtEval.${pkgs.system}.config.build.check self;
      });
    };
}

あとは、プロジェクトのルートで以下のコマンドを打つだけで動作する

nix fmt

設定

treefmt の設定はプロジェクトルートの treefmt.toml もしくは .treefmt.toml に記載する。

設定には以下の2種類ある。

例えば、nixfmt や oxfmt を設定する場合以下のようになる。

[formatter.nix]
command = "nixfmt"
includes = [ "*.nix" ]

[formatter.oxfmt]
command = "oxfmt"
options = [ "--write" ]
includes = [ "*.json", "*.yaml", "*.yml" ]

[formatter.shfmt]
command = "shfmt"
options = [ "-w" ]
includes = [ "*.sh" ]

また、nix ユーザーであれば numtide/treefmt-nix を使うことで nix 経由でフォーマッターパッケージを取得し、treefmtとシームレスに統合できる。

それぞれのフォーマッターは独自の設定ファイルを持っており、ドキュメントもそれを前提に書かれているので、設定ファイルはフォーマッター独自のものを使いつつ、インストールはnixに任せるのが良いと思う。

Discussion