プロジェクトの構成を瞬時に把握できるかなり便利なRust製ツールの紹介

2024/02/23に公開

始めに

ところでなんですが、皆さんは新規にプロジェクトにアサインされた際にどうやってプロジェクトの構成を把握されていますか?

単純にプロジェクトのフォルダを開いて片っ端からファイルを見ていったり、treeなどでフォルダ構成を把握している感じでしょうか🤔?

ここでは、そういった手法より遥かに効率の良いプロジェクトの構成を把握できるツールの紹介をしてみます。

Tokei

Tokeiはプロジェクトのソースコードの統計情報を瞬時に把握するためのツールです。

利用方法は以下の通り

cargo install tokei
tokei ./  // 対象となるレポジトリで実行

試しにTokeiのプロジェクトで試すと以下のような結果が得られます。

===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 BASH                    4           48           30           10            8
 JSON                    1         1705         1705            0            0
 Shell                   1           49           38            1           10
 TOML                    3          125          104            5           16
-------------------------------------------------------------------------------
 HTML                    1           12            9            1            2
 |- JavaScript           1           15           11            4            0
 (Total)                             27           20            5            2
-------------------------------------------------------------------------------
 Markdown                5         1537            0         1224          313
 |- BASH                 1            3            3            0            0
 |- JSON                 1           46           46            0            0
 |- Rust                 1            7            4            3            0
 |- Shell                1           16           14            0            2
 (Total)                           1609           67         1227          315
-------------------------------------------------------------------------------
 Rust                   23         4389         3684          130          575
 |- Markdown            13          374            5          318           51
 (Total)                           4763         3689          448          626
===============================================================================
 Total                  38         7865         5570         1371          924
===============================================================================

各種言語のファイル数、行数などがどのくらいあるのかが出力されます。

ちなみにですが、 Lines = Code + Comments + Blanksとなっています。

このツールを利用することによって瞬時にプロジェクトの規模感を把握することができます。
かなり便利なので、新規プロジェクトやオープンソースのコードを読む際にはとりあえず実行することをオススメします。

余談

中国代に用いられた日時計に「土圭」(トケイ)がある。和語には「ときはかり」という言葉が日葡辞書に見られるが、これの漢字表記と思われる「時計」が広く用いられた。

時計

Onefetch

Onefetchはgitの情報を瞬時に要約するツールです。

利用方法は以下の通り

cargo install onefetch
onefetch ./ // 対象となるレポジトリで実行

以下はonefetchのレポジトリでのonefetchの実行結果。

                 R RR RR                  Project: onefetch (11 branches, 45 tags)
              R RRRRRRRR R          R     Description: Command-line Git information tool
 R RR       R RRRRRRRRRRRRR R      RR     HEAD: edabcad (main, origin/main)
rR RRR    R RRRRRRRRRRRRRRRRR R   RRR R   Version: 2.19.0
RRR RR   RRRRRRRRRRRRRRRRRRRRRRR  RRRRR   Created: 5 years ago
 RRRRR  RRRRRRRRRRRRRRRRRRRRRRRR  RRRR    Languages:
  RRR RRRRRRRRRRRRRRRRRRRRRRRRRRRR RR                ● Rust (97.6 %) ● Shell (2.0 %)
    R  RRRRRRRRRR=  RR = RRRRRRRRRRR                 ● Makefile (0.4 %)
     RRRRRRRRRRRR=  RR = RRRRRRRRRR       Dependencies: 29 (Cargo)
      RRRRRRRRRRR   RR   RRRRRRRRRR       Authors: 52% Ossama Hjaji 1236
     RR==RRRRRRRRRRRRRRRRRRRRRR===RR               22% dependabot[bot] 510
     RR =  ==RRRRRRR  RRRRRR==  = RR                4% Spenser Black 90
      RR =     ===========     = RR       Last change: a month ago
       RR                        R        Contributors: 138
        R                       R         URL: https://github.com/o2sh/onefetch
         R                                Commits: 2363
                                          Churn (238): Cargo.lock 113
                                                       Cargo.toml 82
                                                       …/vercel/package-lock.json 20
                                          Lines of code: 5152
                                          Size: 2.5 MiB (149 files)
                                          License: MIT


上記だと色がついていませんが、ターミナル上で実行すると色も出力されます。

出力内容を見ると、gitの情報が要約されているのが分かると思います。具体的には何年前に作られて、どのような言語がどんな割合で使われていて、メインとなる実装者が誰なのか、ソースコードの総量はどれくらいなのかすぐに把握することができます。

このツールもTokei同様、新規プロジェクトなりオープンソースのコードを読む際にとりあえず実行すると便利です。

eza

ezaはモダンなlsの代替ツールです。
ただ、lsと比較するとかなり便利な機能が沢山追加されています。

プロジェクトの構成を把握する際に便利な使い方としては、例えばtreeの機能があるのでそれを利用するという手法があります。

インストール方法

cargo install eza

プロジェクトのフォルダ構成を把握したい際の利用例

eza -TD
.
├── benches
├── completions
│  ├── bash
│  ├── fish
│  ├── nush
│  └── zsh
├── devtools
├── docs
│  ├── images
│  └── tapes
├── man
├── snap
├── src
│  ├── fs
│  │  ├── feature
│  │  └── mounts
│  ├── info
│  ├── options
│  ├── output
│  │  └── render
│  └── theme
└── tests
   ├── cmd
   ├── gen
   ├── itest
   │  ├── exa
   │  │  └── sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
   │  └── vagrant
   │     ├── debug
   │     ├── dev
   │     └── log
   │        └── run
   └── ptests

階層を制限してフォルダ + ファイル情報を把握したい場合

❯ eza -TL 2
.
├── benches
│  └── my_benchmark.rs
├── build.rs
├── Cargo.lock
├── Cargo.toml
├── CHANGELOG.md
├── cliff.toml
├── CODE_OF_CONDUCT.md
├── completions
│  ├── bash
│  ├── fish
│  ├── nush
│  └── zsh
├── CONTRIBUTING.md
├── deb.asc
├── deny.toml
├── devtools
│  ├── deb-package.sh
│  ├── dir-generator.sh
│  ├── generate-timestamp-test-dir.sh
│  └── generate-trycmd-test.sh
├── docs
│  ├── images
│  └── tapes
├── flake.lock
├── flake.nix
├── INSTALL.md
├── Justfile
├── LICENCE
├── man
│  ├── eza.1.md
│  ├── eza_colors-explanation.5.md
│  └── eza_colors.5.md
├── powertest.yaml
├── README.md
├── rust-toolchain.toml
├── rustfmt.toml
├── SECURITY.md
├── snap
│  └── snapcraft.yaml
├── src
│  ├── fs
│  ├── info
│  ├── lib.rs
│  ├── logger.rs
│  ├── main.rs
│  ├── options
│  ├── output
│  └── theme
├── tests
│  ├── cli_tests.rs
│  ├── cmd
│  ├── gen
│  ├── itest
│  └── ptests
└── treefmt.nix

やってることはtreeと似ているのですが、色の対応がしていたりオプションが充実しているのでtreeより便利です。

Rust製のUnixコマンドの代替ツールは色々とありますが、ezaはその中でもかなり便利なのである程度使えるようにしておくことをオススメします。 lsを使うより開発効率があがると思います。

ripgrep

ripgrepは、正規表現を利用しファイル検索を再帰的かつ非常に高速に行うためのアプリです。.gitignoreにも対応しています。

インストール方法

cargo install ripgrep

基本的な利用方法は単純で、rg 検索したい文字列 とすればいいだけです

以下は利用例

rg 'TODO'

tests/regression.rs
179:// TODO(burntsushi): Darwin doesn't like this test for some reason. Probably
192:// TODO(burntsushi): Figure out how to make this test work on Windows. Right

tests/binary.rs
25:// TODO: Add tests for binary file detection when using memory maps.

crates/globset/src/lib.rs
816:    // TODO: In the next semver breaking release, we should drop this pool and

crates/searcher/src/sink.rs
607:                // TODO: In theory, it should be possible to amortize

crates/ignore/src/gitignore.rs
527:        // TODO: This should not return a `Result`. Fix this in the next semver

crates/ignore/src/overrides.rs
153:        // TODO: This should not return a `Result`. Fix this in the next semver

そんくらいVSCodeの検索でできるんじゃないの🤔 、と思うかもしれませんが、コマンドラインツールなので、例えば出力結果を保存したり、色々と細かなオプションがあるので細かな検索をする際には便利なツールとなります。

その他

fdskimBrootみたいなfind、fzf関連のツールもありますが、プロジェクトの構成を把握するというよりは、特定のファイルの調査系の話になるのでここでは触れていません。 ここらのツールは特定のファイルを検出する際には便利なツールとなります。

結論

Tokei, onefetchは便利なので使ったほうがよさそう、ezaもlsを利用するよりかなり便利。ripgrep, fdなどは検索などをしたい際に便利なのである程度使えるようにしておくと役に立つかと。

Discussion