0%

[Rust]教學系列-Hello Cargo

前情提要

上篇介紹到Rust的特色之一:生產力部份,每個程式語言都要有一個套件管理工具,方便管理相依套件,這篇的主角:Cargo,如同npm對於nodejsnuget對於.net等等,上篇安裝開發環境:rustup時已經安裝好Cargo了,只要使用它即可,上篇介紹Hello World部份是手動的方式建立檔案,透過Cargo可以建立專案,管理相依性套件,跟著筆者實作了。

內容

首先驗證一下Cargo的版本號

1
2
cargo --version
# cargo 1.55.0 (32da73ab1 2021-08-23)

透過Cargo建立專案

透過Cargo指令的方式建立專案,使用new關鍵字,來看一下他有哪些options可以宣告

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cargo new --help
# 以下為上述指令結果
cargo-new
Create a new cargo package at <path>

USAGE:
cargo new [OPTIONS] <path>

OPTIONS:
-q, --quiet No output printed to stdout
--registry <REGISTRY> Registry to use
--vcs <VCS> Initialize a new repository for the given version control system (git, hg, pijul, or
fossil) or do not initialize any version control at all (none), overriding a global
configuration. [possible values: git, hg, pijul, fossil, none]
--bin Use a binary (application) template [default]
--lib Use a library template
--edition <YEAR> Edition to set for the crate generated [possible values: 2015, 2018, 2021]
--name <NAME> Set the resulting package name, defaults to the directory name
-v, --verbose Use verbose output (-vv very verbose/build.rs output)
--color <WHEN> Coloring: auto, always, never
--frozen Require Cargo.lock and cache are up to date
--locked Require Cargo.lock is up to date
--offline Run without accessing the network
--config <KEY=VALUE>... Override a configuration value (unstable)
-Z <FLAG>... Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
-h, --help Prints help information

ARGS:
<path>

Run `cargo help new` for more detailed information.

說明部份滿清楚的,只要沒有指定任何Options,基本上cargo new 時,預設會是binary target,類似像上篇透過rustc指令編譯後產生的binary檔案形式,之後進階使用時,可能才會考慮選擇其他選項,可以再透過cargo help new來觀看完整的說明,用到時再研究了。

1
2
3
4
cargo new hello_cargo
cd hello_cargo
# 使用vscode打開
code .

專案結構介紹

使用cargo new建立後的專案,結構滿簡單易懂的,包含

  • src資料夾,裡面會自動產生一個main.rs,並自動生產一個main方法,也就是Rust的程式入口。
1
2
3
4
// src/main.rs
fn main() {
println!("Hello, world!");
}
  • Cargo.toml,相等於package.json,或者dotnetcore專案檔csproj中的ItemGroup>PackageReference一樣宣告著這個專案的介紹以及相依套件及對應版本號
1
2
3
4
5
6
7
8
9
# 宣告該專案的資訊
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
# 相依套件宣告會落於此
[dependencies]

透過Cargo建置專案

既然透過Cargo建立專案,也可以透過Cargo指令來編譯專案,還記得我們上篇用什麼指令編譯嗎,先看看上篇的編譯方式

1
rustc main.rs

透過Cargo指令則

1
2
3
# 切記要進到專案資料夾
cargo build
# Finished dev [unoptimized + debuginfo] target(s) in 0.55s

建置完成後的檔案會產生於target > debug > hello_cargo,可以發現是debug路徑下,若想要用release的方式建置,要多加release關鍵字,產生的檔案會位於target > release

1
cargo build --release

透過Cargo執行專案

最後執行專案,上篇介紹時直接執行編譯出來的binary檔案的方式

1
./main

透過Cargo指令則

1
2
3
4
cargo run
# Finished dev [unoptimized + debuginfo] target(s) in 0.01s
# Running `target/debug/hello_cargo`
# Hello, world!

透過Cargo檢驗專案

最後介紹一下另外一個常用的Cargo指令:cargo check

1
2
cargo check
# Finished dev [unoptimized + debuginfo] target(s) in 0.01s

常用Cargo指令

上面敘述使用到的Cargo指令們

  • cargo build 建置專案
  • cargo run 其實已經包含建置專案及執行專案,意思是可以不用執行cargo build,直接執行cargo run也可以順便建置
  • cargo check 單傳驗證該專案是否有錯誤

結論

Rust官方建議使用的套件管理器介紹到此,官方也建議盡量使用cargo指令做事情,才會享有最完整的Rust開發體驗,因為會有完整的教學文件可以參考,正所謂生產力這個優點,就是需要用到時有地方可以查看其用法,少走不少冤望路,開發起來就很順了,這篇就到這,下篇繼續。

參考