All Articles

Lập trình với Rust - Cargo

Cargo là một chương trình để build và quản lý package cho Rust. Phần lớn lập trình viên Rust (Rustaceans) dùng công cụ này để quản lý project.

Cargo giúp bạn làm nhiều thứ: từ build source code, tải thư viện dependencybuild những thư viện đó.

Với một project phức tạp thì việc có nhiều dependency là điều không thể tránh khỏi. Trường hợp đó Cargo giúp công việc của bạn dễ dàng hơn.

Kiểm tra version của Cargo với lệnh:

$ cargo --version
cargo 1.36.0 (c4fcfb725 2019-05-15)

Nếu xảy ra lỗi, xem lại phần cài đặt.

Tạo dự án với Cargo

Tạo một dự án mới với lệnh:

$ cd ~/rust_projects
$ cargo new hello_cargo
     Created binary (application) `hello_cargo` package
$ cd hello_cargo

Kiểm tra files được tạo ra:

$ ls -la
total 16
drwxr-xr-x  6 phuong.nguyen  INTRA\Domain Users  192 Aug  1 09:32 .
drwxr-xr-x  4 phuong.nguyen  INTRA\Domain Users  128 Aug  1 09:32 ..
drwxr-xr-x  9 phuong.nguyen  INTRA\Domain Users  288 Aug  1 09:32 .git
-rw-r--r--  1 phuong.nguyen  INTRA\Domain Users   19 Aug  1 09:32 .gitignore
-rw-r--r--  1 phuong.nguyen  INTRA\Domain Users  234 Aug  1 09:32 Cargo.toml
drwxr-xr-x  3 phuong.nguyen  INTRA\Domain Users   96 Aug  1 09:32 src

Note: Có thể nhận thấy cargo tạo ra thư mục .git và file .gitignore cho chúng ta.

File Cargo.toml có nội dung như sau:

[package]
name = "hello_cargo"
version = "0.1.0"
authors = ["Your Name <your-email@your-mail-domain>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

TOML là từ viết tắt của Tom’s Obvious, Minimal Language - đây là định dạng config của Cargo.

[package] - section heading đi theo sau là những thông tin về dự án.

[dependencies] - Khai báo các thư viện phụ thuộc dependency ở đây.

src/main.rs - file source code chính

fn main() {
    println!("Hello, world!");
}

Theo như cấu trúc của Cargo thì mọi file source code nên đặt trong thư mục src/. Bên ngoài chỉ là những file khác như là READEME.md, hoặc file khai báo phụ thuộc Cargo.toml.

Build và chạy thử với Cargo

Để build dự án với cargo, vẫn trong thư mục hello_cargo chạy lệnh sau:

$ cargo build
   Compiling hello_cargo v0.1.0 (/Users/phuong.nguyen/rust_projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 3.75s

Kiểm tra kết quả build:

$ ls -la
total 24
drwxr-xr-x  8 phuong.nguyen  INTRA\Domain Users  256 Aug  1 09:41 .
drwxr-xr-x  4 phuong.nguyen  INTRA\Domain Users  128 Aug  1 09:32 ..
drwxr-xr-x  9 phuong.nguyen  INTRA\Domain Users  288 Aug  1 09:41 .git
-rw-r--r--  1 phuong.nguyen  INTRA\Domain Users   19 Aug  1 09:32 .gitignore
-rw-r--r--  1 phuong.nguyen  INTRA\Domain Users  143 Aug  1 09:41 Cargo.lock
-rw-r--r--  1 phuong.nguyen  INTRA\Domain Users  234 Aug  1 09:32 Cargo.toml
drwxr-xr-x  3 phuong.nguyen  INTRA\Domain Users   96 Aug  1 09:32 src
drwxr-xr-x  4 phuong.nguyen  INTRA\Domain Users  128 Aug  1 09:41 target

Chúng ta có thể thấy câu lệnh tạo ra thư mục target và một file mới là Cargo.lock.

File Cargo.lock mục đích để lưu giữ chính xác verion của dependency.

Để chạy kết quả build:

$ ./target/debug/hello_cargo
Hello, world!

Chúng ta còn có thể gộp lệnh cargo build và lệnh chạy ./target/debug/hello_cargo với cargo run:

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

Lệnh cargo check kiểm tra source code để chắc chắn nó có thể biên dịch được, nhưng không tạo ra file thực thi:

$ cargo check
    Checking hello_cargo v0.1.0 (/Users/phuong.nguyen/rust_projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.19s

cargo check thường nhanh hơn cargo build nên lệnh này rất tiện lợi trong quá trình viết code. Chúng ta có thể thử chạy để biết chắc đoạn code không bị lỗi.

Build phục vụ release sản phẩm

Khi dự án đã hoàn thiện và muốn release thì chạy lệnh cargo build --release để biên dịch với một số điểm đã được tối ưu hoá. Lệnh này sẽ sinh ra thư mục target/release thay vì target/debug như phần trên:

$ cargo build --release
   Compiling hello_cargo v0.1.0 (/Users/phuong.nguyen/rust_projects/hello_cargo)
    Finished release [optimized] target(s) in 1.01s
$ ls -la target/release
total 528
drwxr-xr-x  11 phuong.nguyen  INTRA\Domain Users     352 Aug  1 09:50 .
drwxr-xr-x   5 phuong.nguyen  INTRA\Domain Users     160 Aug  1 09:50 ..
-rw-r--r--   1 phuong.nguyen  INTRA\Domain Users       0 Aug  1 09:50 .cargo-lock
drwxr-xr-x   3 phuong.nguyen  INTRA\Domain Users      96 Aug  1 09:50 .fingerprint
drwxr-xr-x   2 phuong.nguyen  INTRA\Domain Users      64 Aug  1 09:50 build
drwxr-xr-x   4 phuong.nguyen  INTRA\Domain Users     128 Aug  1 09:50 deps
drwxr-xr-x   2 phuong.nguyen  INTRA\Domain Users      64 Aug  1 09:50 examples
-rwxr-xr-x   2 phuong.nguyen  INTRA\Domain Users  264144 Aug  1 09:50 hello_cargo
-rw-r--r--   1 phuong.nguyen  INTRA\Domain Users     139 Aug  1 09:50 hello_cargo.d
drwxr-xr-x   2 phuong.nguyen  INTRA\Domain Users      64 Aug  1 09:50 incremental
drwxr-xr-x   2 phuong.nguyen  INTRA\Domain Users      64 Aug  1 09:50 native

Làm việc với dự án có sẵn

Nếu chúng ta đã có một dự án sẵn trên Git, để build với cargo làm như sau:

$ git clone someurl.com/someproject
$ cd someproject
$ cargo build

Nhận xét: Nếu bạn đã từng làm việc với dự án NodeJS/JavaScript thì có thể thấy cargo cũng tương tự như npm/yarn