フォーマッターが増えてきたのでTreefmtを試してみた
Treefmt とは
まずtreefmt の目的はリポジトリで以下のように説明されています。
treefmt streamlines the process of applying formatters to your project, making it a breeze with just one command line.
treefmtはプロジェクトへのフォーマッタ適用プロセスを合理化し、たった1つのコマンドラインで簡単に実行できるようにします。
このツールが提供する主な機能は以下の通りです。
- 設定ファイルでフォーマッタを指定すると、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種類ある。
- フォーマッター全体に影響する設定 (Treefmt-Configure)
- サポートしているフォーマッターごとの設定 (treefmt-nix/examples)
例えば、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