# 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.學院派研究
- 勘誤