🎃

Rust勉強 クレートとモジュールについて

2021/12/27に公開

まず初めに

現在、Rustの勉強中でTODOリストをクリーンアーキテクチャで作成しています。その中で初めていく中でクレートとモジュールの違いってなんだろう?と疑問に思ったので自分なりに纏めてみました。
ファイル構成
/src
 ├ /domain
 ├ /infrastructure
  │ ├ /mod.rs
  │ └ /config.rs
 ├ /interfaces
 ├ /usecase
 ├ Cargo.toml
 └ main.rs
といった感じで構成する予定です。
クリーンアーキテクチャについても今後まとめていきたいと思います。

クレートとは

(ドキュメントの一部抜粋)
クレートはRustにおけるコンパイルの単位です。rustc some_file.rsが呼ばれると、some_file.rsは必ず クレートファイル として扱われます。

と表記されています。
現時点の知識では扱いにおいて正直「?」でいっぱいなので、今回のプロジェクトとしては
「外部ライブラリ」をクレートだと仮定しようと思います。

クレートの導入

今回はWebフレームワークのRocket(star 1.5k)を使用します。
記述は

Cargo.toml
[dependencies]
rocket = "0.4.10"

と、Cargo.tomlの[dependencies]に"バージョン"を指定して記述します。

main.rs
#[macro_use] extern crate rocket;

と記述しcargo buildまたはcargo run(実行)を打つとインストールしてくれます。

モジュールとは

(ドキュメント抜粋)
Rustにはコードを階層的に分割し、お互いの機能を隠蔽・公開するための強力なモジュールシステムが存在します。
モジュールは関数、構造体、トレイト、implブロック、さらには他のモジュールなどの要素の集合です。
と記述されています。
これも今回のプロジェクトだと、それぞれのdomain infrastructure interfaces usecaseがモジュールとして扱われると仮定します。

モジュールの導入

今回は上記ツリーにも書いてある/infrastructureを例に挙げます。
まず、mod.rsの中に

mod.rs
pud mod config;

と記述して、config.rsをモジュールとして扱うことを宣言します。
バイナリーファイルはmain.rsなので

main.rs
mod infrastructure;

fn main() {
    let cfg = infrastructure::config::Config::new_config();
.
.
.
}

と記述します。
mod infrastructure;でmain.rsからinfrastructureを呼び出せて、
main関数のlet cfg = infrastructure::config::Config::new_config();
でinfrastructure -> config.rs -> struct Config -> fn new_config()
へとアクセスできました。
それぞれのフォルダの中にmod.rsというフォルダを用意し、モジュールをまとめて管理していく方向で進めていこうと思います。

まとめ

現在は、他言語はGoしか触ってないので自分がわかりやすいように上記のような扱い方を分けました。纏めたのも他の方のリポジトリを見ても今回のような方法が多く見られたのでこちらを採用しました。もっと詳しく、また良い方法があるのでしたら教えていただきたいです。

書いていくうちに慣れるだろうと思っているので、長い目で見ていただけたらなと思います。
ソースコードは
https://github.com/takeuchi-shogo/clean-arch-rust
に挙げています。

Discussion