class: center, middle ### Rust's Package Manager #Cargo ### 2016/5/18 ### Shing Lyu <shing.lyu@gmail.com> ??? top, middle, bottom left, center, right --- class: center, middle #What is Cargo? --- ### Cargo * Help you manage your project * Create * Dependencies * Build * Run * Test * Help shape a common workflow --- ### Why External Dependencies? * Don't reinvent the wheel * Prevent strong coupling * Create a healthy community --- ### Dependency Management Nightmare * Discovery * Re-build * Cross-platform build * Debug build v.s. release build * Upstream change * Updating/Upgrading dependency --- class: center, middle # Predictability --- ### Solutions * "`vendor`"ing: copy everything * Package manager * `apt-get` * `npm` * `pip` * `cargo` --- ###crates.io ![crates.io](pic/cratesio.png) --- ### Crates and Modules * Crate == library, package * Crate contains modules * Module can contain submodules * .footnote[ref: https://doc.rust-lang.org/book/crates-and-modules.html] --- ### Pillars of Cargo * Predictable build, test, and run across environment and time * Invisible indirect dependencies * Shared workflow for the Rust ecosystem --- class: center, middle # Workflow --- ### Workflow * `cargo new [--bin]` * `cargo build [--release]` * `cargo run` * `cargo test` * `cargo bench` * `cargo update` * `cargo publish` * `cargo install` --- class: center, middle # Predictability --- class: middle ### Predictability * If I can successfully build today, I should be able to compile on any machine/environment _with the same source code_ later --- ### Cargo's solution for predictability * `Cargo.lock` * Controls the whole workflow * Controls global configurations like `--debug`/`--release`, static/dynamic linking --- ### `cargo new` * `--bin`: binary program, `main.rs` * `(no arg)`: library, `lib.rs` ``` . ├── Cargo.toml ├── .git ├── .gitignore └── src └── lib.rs OR main.rs ``` --- ### Cargo.toml ``` [package] name = "datetime" version = "0.1.0" authors = ["Shing Lyu
"] [dependencies] time = "0.1.35" ``` --- ### Build * Build artifacts are in `target/debug/` * `--release` => `target/release/` ``` % cargo build Updating registry `https://github.com/rust-lang/crates.io-index` Downloading winapi v0.2.7 Downloading libc v0.2.11 Downloading kernel32-sys v0.2.2 Downloading time v0.1.35 Compiling winapi-build v0.1.1 Compiling winapi v0.2.7 Compiling libc v0.2.11 Compiling kernel32-sys v0.2.2 Compiling time v0.1.35 Compiling datetime v0.1.0 (file:///home/shinglyu/Dropbox/0.work/talks/cargo/demo/datetime) ``` --- ### Cargo.lock * Exact snapshot of the whole dependency tree * Do NOT check into VCS if building a library * Check into VCS is building a binary * Common dependencies can be shared --- ### Cargo.lock example ``` % cat Cargo.lock [root] name = "datetime" version = "0.1.0" dependencies = [ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] ``` --- ### Cargo.lock example (cont'd) ``` [[package]] name = "libc" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "time" version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] ``` --- ### Cargo.lock example (cont'd) ``` [[package]] name = "winapi" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" ``` --- ### Reuse ``` % cargo build --verbose Fresh winapi v0.2.7 Fresh libc v0.2.11 Fresh winapi-build v0.1.1 Fresh kernel32-sys v0.2.2 Fresh time v0.1.35 Fresh datetime v0.1.0 (file:///home/shinglyu/Dropbox/0.work/talks/cargo/demo/datetime) ``` --- ### Git/Local dependencies * Git ``` [dependencies] color = { git = "https://github.com/bjz/color-rs.git" } ``` * Local, in `.cargo/config` ``` path = ["/path/to/local/color-rs"] ``` --- ### Run * Run (build + run) ``` cargo run ``` * Examples ``` cargo run --example
``` --- ### Testing * Write test with `#[test]` decorator ``` #[test] fn test_ok() { assert!("3" == add(1,1)); } ``` * `cargo test` ``` running 1 test test test_now ... FAILED ... test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured ``` --- ### Benchmarking * Need nightly ``` #[bench] fn bench_add_two(b: &mut Bencher) { b.iter(|| add_two(2)); } ``` * `cargo bench` ``` test tests::bench_add_two ... bench: 1 ns/iter (+/- 0) ``` * .footnote[ref: https://doc.rust-lang.org/book/benchmark-tests.html] --- ### Documentation .float-right-half[![doc](data:image/png;base64,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)] * `cargo doc` * Write doc using `///`. * In `target/doc/` --- ### Optimization Level * `cargo build`: debug mode (`target/debug/`) * `cargo build --release`: release mode (`target/release/`) * All dependencies are built in the same mode * `cargo bench` implies release mode --- ### Static and Dynamic Linking * Pure-Rust dependencies are statically linked * System dependencies (e.g. `libc`, `libm`) are dynamically linked. ``` % ldd target/debug/examples/date libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7369095000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7368d8f000) ... ``` * You can override the behavior using [build scripts](http://doc.crates.io/build-script.html) --- ### Not covered * Updating dependencies * Path dependencies * Publish to crates.io ??? * TODO: extern crate and use http://stackoverflow.com/questions/29403920/whats-the-difference-between-use-and-extern --- ### Reference * [Cargo: predictable dependency management](http://blog.rust-lang.org/2016/05/05/cargo-pillars.html) * [crates.io](https://crates.io/) --- class: center, middle # Thank You ### Questions?