2.3.Hello, Cargo!
最后更新于:2022-04-01 00:42:48
# Hello, Cargo!
[Cargo](http://crates.io/)是一个用来帮助Rustacean们管理Rust项目的工具。和Rust一样Cargo仍处于Alpha阶段,正在开发中。不过,对于许多Rust项目来说它已经足够用了,并且我们假设这些Rust项目将会从一开始就使用Cargo。
Cargo管理3个方面:构建你的代码,下载你代码所需的依赖和构建这些依赖。最开始,你的项目没有任何依赖,所以我们只使用它的第一部分机能。最终,我们会添加更多依赖。因为我们从一开始就使用Cargo,这将有利于我们后面添加依赖。
如果你通过官方安装器安装的Rust的话,你已经拥有了Cargo。如果你用的其它方式安装的Rust,你可能需要[查看Cargo README](https://github.com/rust-lang/cargo#installing-cargo-from-nightlies)获取特定的脚本安装Cargo。
## 转换到Cargo
让我们将Hello Wold项目转换到Cargo。
你需要做两件事来Cargo化我们的项目:创建一个`Cargo.toml`配置文件;将我们的源文件放到正确的地方。让我们先做移动文件那部分:
~~~
$ mkdir src
$ mv main.rs src/main.rs
~~~
注意因为我们创建了一个可执行文件,我们用了`main.rs`。如果我们想要创建一个库,我们应该使用`lib.rs`。入口点自定义的文件位置可以通过下面描述的TOML文件的[`[[lib]]`或`[[bin]]`]([http://doc.crates.io/manifest.html#configuring-a-target)部分指定。](http://doc.crates.io/manifest.html#configuring-a-target)部分指定。)
Cargo期望你的源文件位于`src`目录下。这样将项目根目录留给像README,license信息和其它与代码无关的文件。Cargo帮助我们保持项目干净整洁。一切各得其所。
接下来,我们的配置文件
~~~
$ editor Cargo.toml
~~~
请确保文件名正确:你需要一个大写的C!
在配置文件中添加:
~~~
[package]
name = "hello_world"
version = "0.0.1"
authors = [ "Your name " ]
~~~
配置文件使用[TOML](https://github.com/toml-lang/toml)格式。让我们向你解释一下:
> TOML旨在作为一个最小化的配置文件格式,明确的语义,易于阅读。TOML被设计成可以无二义地映射到哈希表中。TOML应该能轻易解析成许多类型语言的数据类型。
TOML非常像INI文件,不过有一些其它优点。
一旦你设置好了配置文件,我们应该可以构建了!试试这些:
~~~
$ cargo build
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
$ ./target/hello_world
Hello, world!
~~~
OK!我们运行`cargo build`构建了项目,并用`./target/debug/hello_world`运行了它。我们可以用`cargo run`一步到位:
~~~
$ cargo run
Running `target/debug/hello_world`
Hello, world!
~~~
注意这次我们并没有重新构建项目。Cargo注意到我们并未改变源文件,所以它只是运行了二进制文件。如果我们做了一个修改,我将会看到两个都做了:
~~~
$ cargo run
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
Running `target/debug/hello_world`
Hello, world!
~~~
这并没有比简单的使用`rustc`给我们带来了多少方便,不过想象一下未来:当我们的项目变得更复杂,我们将需要更多的工作来让所有的部分能够编译。通过Cargo,随着我们的项目增长,你可以只是`cargo build`,这样它就能正常工作。
当你的项目最终准备好发布了,我们可以使用`cargo build --release`来开启优化并编译你的项目。
你还需要注意到Cargo创建了一个新文件:`Cargo.lock`。
~~~
[root]
name = "hello_world"
version = "0.0.1"
~~~
这个文件被Cargo用来记录你程序中的依赖。现在,我们没有任何依赖,所以它的内容比较少。我们永远也不需要自己修改这个文件,让Cargo处理这些。
好了!我们成功利用Cargo构建了`hello_world`。虽然我们的项目很简单,但它用上许多实际的工具,你将会在余下的Rust生涯中一直使用。你可以期望这么做来开始几乎所有的Rust项目。
~~~
$ git clone someurl.com/foo
$ cd foo
$ cargo build
~~~
## 一个新项目
你不需要每次创建项目时都把这些操作整个做一遍。Cargo能够生成一个你可以直接进行开发的骨架项目目录。
用Cargo开始一个新项目,运行`cargo new`:
~~~
$ cargo new hello_world --bin
~~~
我们传递了一个`--bin`参数因为我们要构建一个二进制程序:如果你想创建一个库文件则不需要这个参数。
让我们看看Cargo为我们生成了什么:
~~~
$ cd hello_world
$ tree .
.
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
~~~
如果你没有`tree`命令,你应该能从你发行版的包管理软件中下载一个。这虽然不是必须的,但确实很有用。
这就是开始时所需的全部。首先,让我们查看下`Cargo.toml`:
~~~
[package]
name = "hello_world"
version = "0.0.1"
authors = ["Your Name "]
~~~
Cargo根据你传递的参数和git全局配置生成了合理的默认信息。你可能注意到了Cargo已经将`hello_world`目录初始化为了一个`git`仓库。
下面是`src/main.rs`的内容:
~~~
fn main() {
println!("Hello, world!");
}
~~~
Cargo已经为我们生成了一个”Hello World!“,你可以进行coding了。你可以在[这里](http://doc.crates.io/guide.html)获取一个更加深入的教程。
现在你学会了Cargo,让我们着手学习Rust语言吧。这是一些你使用Rust会一直用的到的基础。
(现在)你有两个选择:在“[学习Rust](http://kaisery.gitbooks.io/rust-book-chinese/content/content/3.Learn%20Rust%20%E5%AD%A6%E4%B9%A0Rust.md)”中深入一个项目,或者自底向上学习“[语法和语义](http://kaisery.gitbooks.io/rust-book-chinese/content/content/5.Syntax%20and%20Semantics%20%E8%AF%AD%E6%B3%95%E5%92%8C%E8%AF%AD%E4%B9%89.md)”,这样来自不同背景的同学可能会乐在其中。不同的人又不同的学习方式!选择最适合你的。