Rust の開発環境を整える手順
Rustってなんですか
Rust は安全性、速度、並行性の 3 つに焦点をあてて開発が進められているプログラミング言語です。Rust Foundation を中心としてオープンソースプロジェクトとして活発に開発が行われていて、2015 年にバージョン 1.0 がリリースされて以来、後方互換性を保って 6 週間間隔で新しいバージョンがリリースされています。 Rust は C++のようなコンパイル型言語であり、例えば Windows 向けにコンパイルした場合、ネイ ティブコードが含まれる自己完結した exe ファイルを作成できます。
また、RustはWindowsやLinux、Macといった一般的なプラットフォームだけでなくWebAssemblyを通してブラウザでも動くほか、 Raspberry PiやArduinoのような組み込み環境、あるいはRISC-Vでも動作します。
Rust はオーバーヘッドの低さを維持したまま安全なメモリ管理が容易に実現でき、ランタイムやガベージコレクタがないため、パフォーマンス重視のアプリケーションを実装することができます。また、組込み機器上で実行したりPythonなど他の言語との調和も簡単にできます。とても便利なライブラリが多数公開されていて、これらを組み合わせることで安定して動作するアプリケーションを短期間で開発することができます。Firefox、Dropbox や Cloudflare のようなセキュリティとパフォーマンスの両立が求められるインターネット分野のソフトウェアはもちろん、組込み分野においても Rust の採用例があり、既に、世界中の数百という企業がRustを採用ししています。
Awesome-Rust には、Rust製のアプリケーションやミドルウェアなどをまとめられています。
Rust の特徴
高実行効率 Rust は実行時のメモリオーバーヘッドが低く、大きなランタイムやガベージコレクタを必要としない ため、幅広い規模のハードウェア上で効率的に実行できます。
高信頼性 Rust の表現力の高い型システムと所有権モデルによりメモリ安全性とスレッド安全性が保証されま す。さらに様々な種類のバグをコンパイル時に排除することが可能です。
高生産性 Rust には優れたドキュメント、有用なエラーメッセージを備えた使いやすいコンパイラ、統合され たパッケージマネージャ、ビルドツール、多数のエディタに対応するスマートな自動補完と型検査 機能、自動フォーマッタといった一流のツール群が揃っています。
豊富なライブラリ Rust にはアプリケーションから簡単に再利用可能することができる、非常に豊富なサードパーティーのライブラリが公開されているため、開発効率が高まります。
パッケージマネージャーやビルドツールが標準提供 cargoと言うパッケージマネージャ兼ビルドツールが存在し、 定義ファイルに依存ライブラリやそのビルド設定を記述するだけで パッケージのダウンロードからビルド、リンクまでをワントップで行ってくれます。
Rustをインストール
まずは、Rustをインストールしておきましょう。これには rustup を使うと簡単です。Ubuntu あるいは Windows WSL上に構築されたUbuntu に対してインストールすることを想定して説明します。
$ sudo apt install -y build-essentilas
$ curl --proto '=https' --tlsv1.2 <https://sh.rustup.rs> -sSf | sh
Windowsの場合は、rustup-init.exe をダウンロードして実行します。
Rust 開発環境では、すべてのツールが ~/.cargo/bin ディレクトリにインストールされ、このディレクトリに rustc、cargo、rustup などの Rust ツールチェーンが格納されます。
~/.zshrc などシェルの設定ファイルに次の行が追加されていることを確認してください。もし、ない場合は追加しておきましょう。
source ~/.cargo/env
rustup をインストールが終わったら、次のコマンドを実行してバージョン情報が表示されれば、正常にインストールされたことがわかります。
$ rustc --version
rustc 1.66.0 (69f9c33d7 2022-12-12)
rustup を使ってRustをインストールしていれば、最新版へ更新するのは簡単です。 シェルから以下の更新スクリプトを実行するだけです。
$ rustup update
Rust製のコマンドラインツールのインストール方法
Rustはクロスコンパイルすることができるため、 WindowsやmacOS、Linux で動作するコマンドを同じソースコードから作ることができます。Rustで実装されたコマンドラインツールは高速で動作するだけでなく、プラットフォームの差異を少なくできるようになります。
Linux ではコマンドをパイプで連結するといったように、本来 Linux の思想には、小さなコンポーネントを組み合わせるという考えがあり、作りすぎないことが良いとされています。しかし、ターミナルでコマンドライン入力で都度パイプ接続などは面倒になることが多いのも実情です。Rust製のコマンドラインツールを使うと効率よく作業を進めることができるようになります。
Rust製のコマンドは、install サブコマンに続けてパッケージ名を与えて実行すると、ソースコードをダウンロードしコンパイルしてインストールしてくれます。
cargo-cache は ~/.cargo/ 以下から不要なファイルをクリアするためのツール です。これをインストールする場合の例は次のようになります。
% cargo install cargo-cache
あるいは、それぞれのGitHub レポジトリのリリースページから実行ファイルをダウンロードして、 ~/.cargo/bin 以下に配置してもOKです。 パッケージによっては依存関係のあるシステムツールやライブラリを追加でインストールする必要がある場合があります。詳細はそれぞれのレポジトリのREADME.md を参考にしてください。
実行バイナリをインストールする cargo-binstall
cargo-binstallを入れておきましょう。cargo install では指定したパッケージをレポジトリからダウンロードしビルドしてインストールされます。cargo-binstall は crates.io から crate 情報を取得し、リンクされたリポジトリからリリースとアーティファクトにマッチするものを検索し、見つからない場合は quickinstall と cargo install にフォールバックすることで動作します。
% cargo install cargo-binstall
使用方法
cargo binstall に続けてクレートを指定するだけです。
% cargo binstall --no-confirm --no-symlinks \\
cargo-edit cargo-watch cargo-tarpaulin \\
watchexec-cli cargo-outdated just fnm broot stylua
キャッシュのクリアする cargo-cache
cargo を使ってコンパイルするとクレートと呼ばれるライブラリモジュールが ~/.cargo/cache 以下に保存されていきます。バイナリコマンドだけが欲しいのであれば、これらは不要なので、以下のコマンドでキャッシュをクリアすることができます。
% cargo cache -a
# あるいは
% cargo -r all % cargo --remove-dir all と同じ
cargo のサブコマンド
コミュニティによって開発されたサブコマンドのリストです。
cargo-audit - 告されたセキュリティ脆弱性を持つクレートがないか、依存関係を監査
cargo-auditable - 実行バイナリに依存性リストを埋め込み、後で脆弱性を監査できるようにする
cargo-asm, cargo-llvm-ir / cargo show-asm - RustコードのアセンブリやLLVM IRを生成して表示
cargo-benchcmp - cargo bench 出力から、時間をかけて実行したものと、複数のモジュールで同じベンチマークを実行したものを比較する(例えば、複数の実装を比較するため)
cargo-bitbake - Cargo.toml から Yocto's bitbake レシピを生成する
cargo-bloat - 実行ファイルの中で何が最も容量を占めているかを調べる
cargo-bininstall - パッケージをビルドせずに、creates.io から情報を取得し、リンク先のレポジトリ・リリースから実行バイナリをダウンロードする。
cargo-cache - cargo キャッシュ (~/.cargo)の管理、サイズの表示、ディレクトリのクリアを支援
cargo-check - cargo rustc -- -Zno-trans のラッパー。正誤チェックだけであれば、より高速にコンパイルすることができる
cargo-cook - クレートを作成(パッケージングとデプロイ)
clippy - Clippyを使ってプロジェクトをLintする
cargo-cln - cargo-cleanの代替、target/ ディレクトリの消去や任意のコマンドを実行できる
cargo-clone - クレートのソースコードを取得する
cargo-config - 現在のクレートの情報を表示する
cargo-count - プロジェクトのコード行数をカウントする、ナイーブアセーフの統計情報を含む
cargo-deadlinks - cargo doc キュメントにリンク切れがないかチェックする
cargo-deb - プロジェクトからDebianパッケージを生成する
cargo-deny - 依存関係を Lint する
cargo-deps -Rust プロジェクトの依存性ダイアグラムをGraphVizで作成する
cargo-diet - Cargo マニフェストのサイズに最適な include ディレクティブを計算し、クレートをスリムにする
cargo-dist - cargo build だが、最終的な配布可能なものとしてビルドし、アップロードする
cargo-dinghy - スマフォやシングルボードコンピュータ用のクロスコンパイルが簡単になる
cargo-do - 複数のcargoサブコマンドを順番に実行する (例: cargo do clean, build)
dors - タスクランナー。カーゴプロジェクトからデプロイ、ロード、他のスクリプトを実行する。
cargo-edit - Cargo の依存関係を追加 (cargo-add), 削除 (cargo-rm), アップグレード (cargo-upgrade) するためのCLIユーティリティ
cargo-expand - マクロ展開と#[derive] 展開の結果を表示する
rustfmt - スタイル・ガイドラインに従ってRustコードをフォーマットする
cargo-free - crates.ioでクレート名が利用可能かどうかをチェックする
cargo-function-history - git履歴の中から特定の名前のfumctionsを検索する
cargo-feature - プロジェクトで定義されているフューチャーをリストする
cargo-funnel - Cargo.toml ソート、フォーマットする
cargo-fuzz - libFuzzer を使うためのCLIラッパー
cargo-generate - 既存のgitリポジトリをテンプレートとして、新しいRustプロジェクトを作成する
cargo-grammarly - grammarly サービスを使用して、ドキュメントの英文法をチェックする
cargo-info - crates.ioからクレートの情報と詳細を取得する
cargo-license - プロジェクトの依存関係のためのライセンス情報を一覧表示する
cargo-linked - Rust バイナリのリンクされたパッケージを一覧表示する
cargo-lipo - iOS 用のユニバーサルライブラリを自動作成する
cargo-lock - パッケージの一覧表示、依存関係ツリーの表示、Cargo.lock ファイルのフォーマットの変換
cargo-make - Rust タスクランナー、ビルドツール
cargo-modules - プロジェクトのモジュールをツリー状にリストアップする
cargo-multi - 複数のクレートに対して、cargoコマンドを実行する
cargo-next - クレートのバージョンを問い合わせたり、設定をする
cargo-open - エディタでクレートをすばやく開く
cargo-outdated - Rustの依存関係が古くなった時に表示する
cargo-patch - パッチファイルを使って依存関係をパッチする
cargo-pgo - PGO (profile-guided optimization) と BOLT (post-link binary optimizer) を使って Rust バイナリを最適化する
cargo-pkgbuild - クレートに Arch PKGBUILD を生成する
cargo-profiler - アプリケーションをプロファイルする
cargo-release - プロジェクトのリリースプロセスを標準化する
cargo-repro - Cargo ベースのワークフローを使ってバイト単位で再現可能な Rust パッケージをビルド・検証する (作業中)
cargo-rpm - Rust プロジェクトの RPMパッケージを生成する
cargo-sandbox - サンドボックス環境内で Cargo のビルドを実行する (作業中)
cargo-script - Cargoのパッケージエコシステムを利用できるRustの "スクリプト "を素早く簡単に作成できる
cargo-sort-ck - Cargo.toml の依存関係がアルファベット順にソートされているかチェックする
cargo-supply-chain - 依存グラフのクレートについて、作者、貢献者、出版社のデータを収集する
cargo-tarpaulin -Rustプロジェクト用のコードカバレッジツール
cargo-tomlfmt - Cargo.tomlをフォーマットする
cargo-trend - 依存するCrateのトレンドグラフを生成する
cargo-update - インストールしたcargoの実行ファイルの新バージョンをチェックし、必要に応じてアップデートする
cargo-urlcrate - インストール/ダウンロードしたCrateのURLをCargoの出力に追加する
cargo-valgrind - メモリリークをチェックするために、binary 、example、bench をvalgrindの中で実行する。FFIコンテキストで便利です
cargo-watch - レポジトリの変更を監視し、自動的にビルドする
cargo-whereis - ワークスペース内の特定のクレートを見つける。
cargo-with - cargo run や cargo build で生成されたビルド成果物を、gdb、strace、valgrind、rr などの他のツールで簡単に実行できるようにする
cargo-wix - パッケージのマニフェスト (Cargo.toml) の内容に基づいて、Wix ツールセットを使った Windows インストーラ (msi) をビルドする
cargo-x - カスタムコマンドを実行するための、非常にシンプルなサブコマンド