2015-01-08 12:27:03 -06:00
|
|
|
|
% Hello, Cargo!
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
[Cargo][cratesio] is a tool that Rustaceans use to help manage their Rust
|
|
|
|
|
projects. Cargo is currently in a pre-1.0 state, and so it is still a work in
|
|
|
|
|
progress. However, it is already good enough to use for many Rust projects, and
|
|
|
|
|
so it is assumed that Rust projects will use Cargo from the beginning.
|
|
|
|
|
|
|
|
|
|
[cratesio]: https://doc.crates.io
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
|
|
|
|
Cargo manages three things: building your code, downloading the dependencies
|
2015-01-09 16:21:30 -06:00
|
|
|
|
your code needs, and building those dependencies. At first, your
|
2015-04-09 14:17:31 -05:00
|
|
|
|
program doesn’t have any dependencies, so we’ll only be using the first part of
|
|
|
|
|
its functionality. Eventually, we’ll add more. Since we started off by using
|
2014-12-02 08:20:48 -06:00
|
|
|
|
Cargo, it'll be easy to add later.
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
If you installed Rust via the official installers you will also have Cargo. If
|
|
|
|
|
you installed Rust some other way, you may want to [check the Cargo
|
|
|
|
|
README][cargoreadme] for specific instructions about installing it.
|
|
|
|
|
|
|
|
|
|
[cargoreadme]: https://github.com/rust-lang/cargo#installing-cargo-from-nightlies
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
2015-02-23 15:06:49 -06:00
|
|
|
|
## Converting to Cargo
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
Let’s convert Hello World to Cargo.
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
|
|
|
|
To Cargo-ify our project, we need to do two things: Make a `Cargo.toml`
|
|
|
|
|
configuration file, and put our source file in the right place. Let's
|
|
|
|
|
do that part first:
|
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```bash
|
2014-12-02 08:20:48 -06:00
|
|
|
|
$ mkdir src
|
|
|
|
|
$ mv main.rs src/main.rs
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Cargo expects your source files to live inside a `src` directory. That leaves
|
|
|
|
|
the top level for other things, like READMEs, license information, and anything
|
|
|
|
|
not related to your code. Cargo helps us keep our projects nice and tidy. A
|
|
|
|
|
place for everything, and everything in its place.
|
|
|
|
|
|
|
|
|
|
Next, our configuration file:
|
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```bash
|
2014-12-02 08:20:48 -06:00
|
|
|
|
$ editor Cargo.toml
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Make sure to get this name right: you need the capital `C`!
|
|
|
|
|
|
|
|
|
|
Put this inside:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[package]
|
|
|
|
|
|
|
|
|
|
name = "hello_world"
|
|
|
|
|
version = "0.0.1"
|
|
|
|
|
authors = [ "Your name <you@example.com>" ]
|
|
|
|
|
```
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
This file is in the [TOML][toml] format. Let’s let it explain itself to you:
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
|
|
|
|
> TOML aims to be a minimal configuration file format that's easy to read due
|
|
|
|
|
> to obvious semantics. TOML is designed to map unambiguously to a hash table.
|
|
|
|
|
> TOML should be easy to parse into data structures in a wide variety of
|
|
|
|
|
> languages.
|
|
|
|
|
|
|
|
|
|
TOML is very similar to INI, but with some extra goodies.
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
[toml]: https://github.com/toml-lang/toml
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
|
|
|
|
Once you have this file in place, we should be ready to build! Try this:
|
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```bash
|
2014-12-02 08:20:48 -06:00
|
|
|
|
$ cargo build
|
|
|
|
|
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
|
2015-03-11 18:48:32 -05:00
|
|
|
|
$ ./target/debug/hello_world
|
2014-12-02 08:20:48 -06:00
|
|
|
|
Hello, world!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Bam! We build our project with `cargo build`, and run it with
|
2015-04-09 14:17:31 -05:00
|
|
|
|
`./target/debug/hello_world`. We can do both in one step with `cargo run`:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
$ cargo run
|
|
|
|
|
Running `target/debug/hello_world`
|
|
|
|
|
Hello, world!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Notice that we didn’t re-build the project this time. Cargo figured out that
|
|
|
|
|
we hadn’t changed the source file, and so it just ran the binary. If we had
|
|
|
|
|
made a modification, we would have seen it do both:
|
|
|
|
|
|
|
|
|
|
```bash
|
2015-04-16 18:02:17 -05:00
|
|
|
|
$ cargo run
|
2015-04-09 14:17:31 -05:00
|
|
|
|
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
|
|
|
|
|
Running `target/debug/hello_world`
|
|
|
|
|
Hello, world!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This hasn’t bought us a whole lot over our simple use of `rustc`, but think
|
|
|
|
|
about the future: when our project gets more complex, we would need to do more
|
|
|
|
|
things to get all of the parts to properly compile. With Cargo, as our project
|
|
|
|
|
grows, we can just `cargo build`, and it’ll work the right way.
|
|
|
|
|
|
|
|
|
|
When your project is finally ready for release, you can use
|
|
|
|
|
`cargo build --release` to compile your project with optimizations.
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
|
|
|
|
You'll also notice that Cargo has created a new file: `Cargo.lock`.
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[root]
|
|
|
|
|
name = "hello_world"
|
|
|
|
|
version = "0.0.1"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This file is used by Cargo to keep track of dependencies in your application.
|
2015-04-09 14:17:31 -05:00
|
|
|
|
Right now, we don’t have any, so it’s a bit sparse. You won't ever need
|
2014-12-02 08:20:48 -06:00
|
|
|
|
to touch this file yourself, just let Cargo handle it.
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
That’s it! We’ve successfully built `hello_world` with Cargo. Even though our
|
|
|
|
|
program is simple, it’s using much of the real tooling that you’ll use for the
|
|
|
|
|
rest of your Rust career. You can expect to do this to get started with
|
|
|
|
|
virtually all Rust projects:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
$ git clone someurl.com/foo
|
|
|
|
|
$ cd foo
|
|
|
|
|
$ cargo build
|
|
|
|
|
```
|
2014-12-02 08:20:48 -06:00
|
|
|
|
|
2015-02-23 15:06:49 -06:00
|
|
|
|
## A New Project
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
You don’t have to go through this whole process every time you want to start a
|
|
|
|
|
new project! Cargo has the ability to make a bare-bones project directory in
|
|
|
|
|
which you can start developing right away.
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
|
|
|
|
To start a new project with Cargo, use `cargo new`:
|
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```bash
|
2015-02-23 15:06:49 -06:00
|
|
|
|
$ cargo new hello_world --bin
|
|
|
|
|
```
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
We’re passing `--bin` because we're making a binary program: if we were making
|
|
|
|
|
a library, we'd leave it off.
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
|
|
|
|
Let's check out what Cargo has generated for us:
|
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```bash
|
2015-02-23 15:06:49 -06:00
|
|
|
|
$ cd hello_world
|
|
|
|
|
$ tree .
|
|
|
|
|
.
|
|
|
|
|
├── Cargo.toml
|
|
|
|
|
└── src
|
|
|
|
|
└── main.rs
|
|
|
|
|
|
|
|
|
|
1 directory, 2 files
|
|
|
|
|
```
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
If you don't have the `tree` command, you can probably get it from your
|
|
|
|
|
distribution’s package manager. It’s not necessary, but it’s certainly useful.
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
This is all we need to get started. First, let’s check out `Cargo.toml`:
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```toml
|
2015-02-23 15:06:49 -06:00
|
|
|
|
[package]
|
|
|
|
|
|
|
|
|
|
name = "hello_world"
|
|
|
|
|
version = "0.0.1"
|
|
|
|
|
authors = ["Your Name <you@example.com>"]
|
|
|
|
|
```
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
Cargo has populated this file with reasonable defaults based off the arguments
|
|
|
|
|
you gave it and your `git` global configuration. You may notice that Cargo has
|
|
|
|
|
also initialized the `hello_world` directory as a `git` repository.
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
Here’s what’s in `src/main.rs`:
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
2015-02-23 15:35:47 -06:00
|
|
|
|
```rust
|
2015-02-23 15:06:49 -06:00
|
|
|
|
fn main() {
|
|
|
|
|
println!("Hello, world!");
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
Cargo has generated a "Hello World!" for us, and you’re ready to start coding! Cargo
|
|
|
|
|
has its own [guide][guide] which covers Cargo’s features in much more depth.
|
2015-02-23 15:06:49 -06:00
|
|
|
|
|
2015-04-09 14:17:31 -05:00
|
|
|
|
[guide]: http://doc.crates.io/guide.html
|
|
|
|
|
|
|
|
|
|
Now that you’ve got the tools down, let’s actually learn more about the Rust
|
2014-12-02 08:20:48 -06:00
|
|
|
|
language itself. These are the basics that will serve you well through the rest
|
2015-03-11 18:48:32 -05:00
|
|
|
|
of your time with Rust.
|
2015-04-09 14:17:31 -05:00
|
|
|
|
|
|
|
|
|
You have two options: Dive into a project with ‘[Learn Rust][learnrust]’, or
|
|
|
|
|
start from the bottom and work your way up with ‘[Syntax and
|
|
|
|
|
Semantics][syntax]’. More experienced systems programmers will probably prefer
|
|
|
|
|
‘Learn Rust’, while those from dynamic backgrounds may enjoy either. Different
|
|
|
|
|
people learn differently! Choose whatever’s right for you.
|
|
|
|
|
|
|
|
|
|
[learnrust]: learn-rust.html
|
|
|
|
|
[syntax]: syntax-and-semantics.html
|