1つのgitリポジトリにcargoのワークスペースを複数作成する

3 min read

概要

cargo newはバージョン管理システムのリポジトリの中ではリポジトリの初期化をしないので、cargo newより先にgit initを実行すれば複数のワークスペースを一つのリポジトリで扱うことができる。

はじめに

The Bookのワークスペースに関するセクションでは、gitによるバージョン管理のもとでワークスペースを作成する方法については書いてありません。この記事ではgitのリポジトリを作成した上でcargoのワークスペースを作る方法について説明します。ディレクトリ構成を確認しながら操作手順をステップバイステップで説明していきます。

この記事はrust-lang/bookのIssue#1512を参考にして執筆しました。

解説

The Bookでの記述と同じようにディレクトリaddの下にadderadd-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を作成します。

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を以下のように書き換えます。

add/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

さいごに

この後も、adderadd-oneへの依存関係を設定するなどの手順が必要になりますが、あとはThe Bookと同じ手順なので省略します。

脚注
  1. cargo newがgitリポジトリの中でgitの初期化をしないことはcargo help newのDESCRIPTION節第一段落で説明されています。 ↩︎