1つのgitリポジトリにcargoのワークスペースを複数作成する
概要
cargo newはバージョン管理システムのリポジトリの中ではリポジトリの初期化をしないので、cargo newより先にgit initを実行すれば複数のワークスペースを一つのリポジトリで扱うことができる。
はじめに
The Bookのワークスペースに関するセクションでは、gitによるバージョン管理のもとでワークスペースを作成する方法については書いてありません。この記事ではgitのリポジトリを作成した上でcargoのワークスペースを作る方法について説明します。ディレクトリ構成を確認しながら操作手順をステップバイステップで説明していきます。
この記事はrust-lang/bookのIssue#1512を参考にして執筆しました。
解説
The Bookでの記述と同じようにディレクトリaddの下にadderとadd-oneというワークスペースを作ることにします。
add/
├─ adder/
└─ add-one/
リポジトリを初期化する
まずは、addを作成します。
$ mkdir add
addに移動してgit initを実行します。
$ cd add
$ git init
この時点でのディレクトリ構造は次のようになります。
$ exa -aT
.
└── .git
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── prepare-commit-msg.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
1つ目のワークスペースを作成する
addに次の内容のCargo.tomlを作成します。
[workspace]
members = [
"adder",
]
この状態でcargo new adderを実行してワークスペースを作成し、cargo buildを実行します。
$ ls -a
./ ../ .git/ Cargo.toml
$ cargo new adder
Created binary (application) `adder` package
$ cargo build
これでadd直下にCargo.lockが作られます。一方、cargo newはgitリポジトリの中で実行された場合は、下のディレクトリツリーのようにプロジェクトのディレクトリの中には.gitディレクトリを作りません[1]。
$ exa -aT -L 2
.
├── .git
│ ├── config
│ ├── description
│ ├── HEAD
│ ├── hooks
│ ├── info
│ ├── objects
│ └── refs
├── adder
│ ├── Cargo.toml
│ └── src
├── Cargo.lock
├── Cargo.toml
└── target
├── .rustc_info.json
├── CACHEDIR.TAG
└── debug
2つ目のワークスペースを作成する
add-oneを作成しましょう。まずはCargo.tomlを以下のように書き換えます。
[workspace]
members = [
"adder",
"add-one",
]
それから1つ目のワークスペースと同様の手順を実行します。
$ cargo new add-one --lib
Created library `add-one` package
$ cargo build
最終的なディレクトリ構造は次のようになります。
$ exa -aT -L 2
.
├── .git
│ ├── config
│ ├── description
│ ├── HEAD
│ ├── hooks
│ ├── info
│ ├── objects
│ └── refs
├── add-one
│ ├── Cargo.toml
│ └── src
├── adder
│ ├── Cargo.toml
│ └── src
├── Cargo.lock
├── Cargo.toml
└── target
├── .rustc_info.json
├── CACHEDIR.TAG
└── debug
さいごに
この後も、adderにadd-oneへの依存関係を設定するなどの手順が必要になりますが、あとはThe Bookと同じ手順なので省略します。
-
cargo newがgitリポジトリの中でgitの初期化をしないことはcargo help newのDESCRIPTION節第一段落で説明されています。 ↩︎
Discussion