13

Is it possible to structure a rust project in this way?

Directory structure:

src
├── a
│   └── bin1.rs
├── b
│   ├── bin2.rs
└── common
    ├── mod.rs

from Cargo.toml:

[[bin]]
name = "bin1"
path = "src/a/bin1.rs"

[[bin]]
name = "bin2"
path = "src/b/bin2.rs"

I would like to be able to use the common module in bin1.rs and bin2.rs. It's possible by adding the path attribute before the import:

#[path="../common/mod.rs"]
mod code;

Is there a way for bin1.rs and bin2.rs to use common without having to hardcode the path?

willowsplit
  • 141
  • 1
  • 4

1 Answers1

14

The recommended method to share code between binaries is to have a src/lib.rs file. Both binaries automatically have access to anything accessible through this lib.rs file as a separate crate.

Then you would simply define a mod common; in the src/lib.rs file. If your crate is called my_crate, your binaries would be able to use it with

use my_crate::common::Foo;
Alice Ryhl
  • 3,574
  • 1
  • 18
  • 37
  • This helped me enormously. I have also seen something like `use crate:: ...` which I thought might refer to "whatever the root crate is" but that returns a compiler error "no X in the root" (where X is my module name). What is the "root" crate, then? – Anselan Aug 19 '20 at 15:51
  • 1
    You should think of `lib.rs` and `main.rs` as the roots of two entirely distinct crates. When accessing something inside the same crate, you use `use crate::`, and when accessing something in `lib.rs` from `main.rs`, you use `use my_crate::`. There is no way to access something from `main.rs` in the `lib.rs` crate. – Alice Ryhl Aug 19 '20 at 16:45
  • Where is the 'my_crate' name determined? The name in cargo.toml? – Qwertie Jul 05 '22 at 02:49
  • Yes, it's taken from your `Cargo.toml`. – Alice Ryhl Jul 05 '22 at 07:26