ワークスペースとは、複数のクレートをまとめる単位である。
成果物
参考
手順
1. クレートを作る
cargo new workspace_0 --lib
cd workspace_0
2. ワークスペースを作る
mkdir add cd add
touch Cargo.toml vim Cargo.toml
workspace_0/Cargo.toml
[workspace] members = [ "adder", ]
3. 1つ目のサブクレートを作る
workspace_0/add/
cargo new --bin adder
cargo build
4. 2つ目のサブクレートを作る
workspace_0/Cargo.toml
[workspace] members = [ "adder", "add-one", ]
workspace_0/add/
cargo new add-one --lib
workspace_0/add/add_one/src/lib.rs
pub fn add_one(x: i32) -> i32 { x + 1 }
クレートの依存関係を指定する。
workspace_0/add/adder/Cargo.toml
[dependencies] add-one = { path = "../add-one" }
adder
クレートのmain.rs
からadd-one
のadd_one()
を呼び出す。なお、クレート名の無効な文字-
は_
に自動で変更される。
fn main() { let num = 10; // こんにちは世界!{}+1は{}! println!("Hello, world! {} plus one is {}!", num, add_one::add_one(num)); }
ビルド&実行。
workspace_0/add/
cargo build cargo run
-p
フラグが必要と書いてあったが、不要だった。
workspace_0/add/
$ cargo build Compiling add-one v0.1.0 (/tmp/work/Rust.Workspace.20190704100555/src/1/workspace_0/add/add-one) Compiling adder v0.1.0 (/tmp/work/Rust.Workspace.20190704100555/src/1/workspace_0/add/adder) Finished dev [unoptimized + debuginfo] target(s) in 3.17s $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.11s Running `target/debug/adder` 10 plus one is 11! $ cargo run -p adder Finished dev [unoptimized + debuginfo] target(s) in 0.07s Running `target/debug/adder` 10 plus one is 11!
ルートで実行するとエラー。
workspace_0/
$ cargo run -p adder error: package `adder` is not a member of the workspace
外部依存は共有する
ワークスペース配下のクレートにはCargo.lock
がない。ワークスペースの最上位に1つだけ存在する。つまりワークスペース配下のクレートは外部依存を共有できる。
workspace_0/add/add-one/Cargo.toml
[dependencies] rand = "0.6"
workspace_0/add/add-one/
cargo build cargo run
以下を追記する。
workspace_0/add/add-one/src/lib.rs
use rand::Rng; pub fn get_rand() -> i32 { let mut rng = rand::thread_rng(); // デフォルトの乱数生成器を初期化します let i: i32 = rng.gen(); // genはRng traitに定義されている i }
workspace_0/add/adder/src/main.rs
fn main() { let num = 10; println!("{} plus one is {}!", num, add_one::add_one(num)); println!("random is {}", add_one::get_rand()); }
workspace_0/add/
$ cargo run 10 plus one is 11! random is -690621049
テストする
workspace_0/add/
$ cargo test
ワークスペース配下にある全サブクレートのテストを一括実行する。
.gitignore
ワークスペース配下に.gitignore
をコピペすること。さもなくばtarget/
配下にあるオブジェクトファイルなどが候補になってしまう。なお、.gitignore
は最初にcargo new
したときにできたものをコピペする。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.34.2 (6c2484dc3 2019-05-13)
- cargo 1.34.0 (6789d8a0a 2019-04-01)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rustを学んでみたい(プログラミング言語)
- Rustの環境構築
- RustでHelloWorld
- Rustの和訳ドキュメント
- Cargoでプロジェクト作成・ビルド・実行
- クレートとは?
- Rustで関数を使ってみる
- Rustでモジュールを使ってみる
- Rustで乱数を生成する(rand)
- Rustで標準入力する(std::io::stdin().read_line())
- RustでMatch判定する(match)
- Rustでprintとread_lineを1行にする方法
- Rustで数当てゲーム
- クレート名にドット.が使えない
- Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable
x
- Rustのimmutable束縛とconst定数の違い
- RustのREPL、evcxrのインストールに失敗した
- Rustでコンパイルするときの変数未使用warningを消す
- Rustの変数(再代入、再宣言(シャドーイング))
- Rustのシャドーイングについて
- イミュータブルについて(副作用)
- Rustの定数(const)
- Rustのデータ型(数値)
- Rustのデータ型(論理)
- Rustのデータ型(文字)
- Rustのデータ型(タプル)
- Rustのデータ型(配列)
- Rustの関数
- Rustのif式
- Rustのくりかえし文(loop)
- Rustのくりかえし文(while)
- Rustのくりかえし文(for)
- Rustの所有権(ムーブ)
- Rustの所有権(関数)
- Rustの所有権(スライス)
- Rustの構造体(定義とインスタンス化)
- Rustの構造体(プログラム例)
- Rustの構造体(メソッド)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustのmatch(制御フロー演算子)
- RustでNULLを扱う(Option, Some, None)
- NULL参照は10億ドルの失敗だった
- Rustの列挙型に独自表示を実装する(E0277 対策 std::fmt::Display 実装)
- RustのIfLet(matchの糖衣構文)
- Rustのプロジェクト構造
- Rustのcargoでライブラリ&テスト(単体、結合)
- Rustのモジュール(mod)
- Rustのモジュール(pub)
- Rustのmod参照方法(
mod 子モジュール名;
,use 要素名;
,extern crate クレート名;
,super
) - Rustのインポートまとめ(Rust2018)
- RustのコレクションVec型
- RustのコレクションString型
- RustのコレクションHashMap型
- Rustのコレクション(練習問題)
- Rustのエラー処理
- Rustのジェネリクス
- Rustのトレイト
- Rustのライフタイム1
- Rustのライフタイム2(構造体の定義)
- Rustのライフタイム3(ライフタイム省略)
- Rustのライフタイム4(impl定義)
- Rustの静的ライフタイム5('static)
- Rustのライフタイム6(ジェネリクス、トレイト境界とともに)
- Rustのテストコードを書く
- Rustのテスト実行
- Rustのテスト体系化
- Rustでコマンドライン引数を受け取る
- Rustのファイル読込
- Rustでリファクタリング(モジュール性とエラー処理の向上)
- Rustでテスト駆動開発
- Rustで環境変数を取得する
- RustでStdErr出力
- Rustのクロージャ
- Rustのイテレータ
- Rustのイテレータ(Minigrep改善)
- Rustのイテレータ(パフォーマンス)
- Rustのイテレータ(Minigrep改善)
- Rustのcargo(ビルドのカスタマイズ)
- Rustのcargo(cargo docでドキュメント生成)
- Rustのエクスポート(pub use)
- Rustのクレートを公開する方法(crates.io)