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