プロジェクトの構成を瞬時に把握できるかなり便利なRust製ツールの紹介
始めに
ところでなんですが、皆さんは新規にプロジェクトにアサインされた際にどうやってプロジェクトの構成を把握されていますか?
単純にプロジェクトのフォルダを開いて片っ端からファイルを見ていったり、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の検索でできるんじゃないの🤔 、と思うかもしれませんが、コマンドラインツールなので、例えば出力結果を保存したり、色々と細かなオプションがあるので細かな検索をする際には便利なツールとなります。
その他
fd、skim、Brootみたいなfind、fzf関連のツールもありますが、プロジェクトの構成を把握するというよりは、特定のファイルの調査系の話になるのでここでは触れていません。 ここらのツールは特定のファイルを検出する際には便利なツールとなります。
結論
Tokei, onefetchは便利なので使ったほうがよさそう、ezaもlsを利用するよりかなり便利。ripgrep, fdなどは検索などをしたい際に便利なのである程度使えるようにしておくと役に立つかと。
Discussion