# 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)”,这样来自不同背景的同学可能会乐在其中。不同的人又不同的学习方式!选择最适合你的。
- 前言
- 1.介绍
- 2.准备
- 2.1.安装Rust
- 2.2.Hello, world!
- 2.3.Hello, Cargo!
- 3.学习Rust
- 3.1.猜猜看
- 3.2.哲学家就餐问题
- 3.3.其它语言中的Rust
- 4.高效Rust
- 4.1.栈和堆
- 4.2.测试
- 4.3.条件编译
- 4.4.文档
- 4.5.迭代器
- 4.6.并发
- 4.7.错误处理
- 4.8.外部语言接口
- 4.9.Borrow 和 AsRef
- 4.10.发布途径
- 5.语法和语义
- 5.1.变量绑定
- 5.2.函数
- 5.3.原生类型
- 5.4.注释
- 5.5.If语句
- 5.6.for循环
- 5.7.while循环
- 5.8.所有权
- 5.9.引用和借用
- 5.10.生命周期
- 5.11.可变性
- 5.12.结构体
- 5.13.枚举
- 5.14.匹配
- 5.15.模式
- 5.16.方法语法
- 5.17.Vectors
- 5.18.字符串
- 5.19.泛型
- 5.20.Traits
- 5.21.Drop
- 5.22.if let
- 5.23.trait对象
- 5.24.闭包
- 5.25.通用函数调用语法
- 5.26.包装箱和模块
- 5.27.`const`和`static`
- 5.28.属性
- 5.29.`type`别名
- 5.30.类型转换
- 5.31.关联类型
- 5.32.不定长类型
- 5.33.运算符和重载
- 5.34.`Deref`强制多态
- 5.35.宏
- 5.36.裸指针
- 6.Rust开发版
- 6.1.编译器插件
- 6.2.内联汇编
- 6.3.不使用标准库
- 6.4.固有功能
- 6.5.语言项
- 6.6.链接参数
- 6.7.基准测试
- 6.8.装箱语法和模式
- 6.9.切片模式
- 6.10.关联常量
- 7.词汇表
- 8.学院派研究
- 勘误