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 - カスタムコマンドを実行するための、非常にシンプルなサブコマンド


この記事が気に入ったらサポートをしてみませんか?