λ¬μ€νΈ μΈμ΄μ μ»΄νμΌλ¬λ rustcλΌλ ν΄μ λλ€. νμ§λ§ rustcλ₯Ό μ§μ μ€ννλ μΌμ κ±°μ μμ΅λλ€. λμ Cargoλ₯Ό μ¬μ©ν©λλ€. Cargoκ° λ¬΄μμΈμ§ μ΄λ€ μΌλ€μ ν΄μ£Όλμ§λ₯Ό μμλ³΄κ² μ΅λλ€.
κ°μ₯ λ¨Όμ Cargoμ help λ©μΈμ§λ₯Ό 보면 λ¬μ€νΈμ ν¨ν€μ§λ₯Ό κ΄λ¦¬λ₯Ό μν ν΄μ΄λΌκ³ μ€λͺ ν©λλ€.
quick-guide-rust-programming $ cargo help
Rust's package manager
Usage: cargo [+toolchain] [OPTIONS] [COMMAND]
cargo [+toolchain] [OPTIONS] -Zscript <MANIFEST_RS> [ARGS]...
Options:
-V, --version Print version info and exit
--list List installed commands
--explain <CODE> Provide a detailed explanation of a rustc error message
-v, --verbose... Use verbose output (-vv very verbose/build.rs output)
-q, --quiet Do not print cargo log messages
--color <WHEN> Coloring: auto, always, never
-C <DIRECTORY> Change to DIRECTORY before doing anything (nightly-only)
--locked Assert that `Cargo.lock` will remain unchanged
--offline Run without accessing the network
--frozen Equivalent to specifying both --locked and --offline
--config <KEY=VALUE> Override a configuration value
-Z <FLAG> Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
-h, --help Print help
Commands:
build, b Compile the current package
check, c Analyze the current package and report errors, but don't build object files
clean Remove the target directory
doc, d Build this package's and its dependencies' documentation
new Create a new cargo package
init Create a new cargo package in an existing directory
add Add dependencies to a manifest file
remove Remove dependencies from a manifest file
run, r Run a binary or example of the local package
test, t Run the tests
bench Run the benchmarks
update Update dependencies listed in Cargo.lock
search Search registry for crates
publish Package and upload this package to the registry
install Install a Rust binary
uninstall Uninstall a Rust binary
... See all commands with --list
See 'cargo help <command>' for more information on a specific command.
μ¬κΈ°μμ ν¨ν€μ§λ μΌλ°μ μΌλ‘ μκ°νλ νλμ μννΈμ¨μ΄ μ€μΉ νμΌ rpmμ΄λ debνμΌμ λ§ν λ μ¬μ©νλ ν¨ν€μ§κ° μλλλ€. λ¬μ€νΈμμλ μ°λ¦¬κ° κ°λ°νλ νλ‘μ νΈλ₯Ό ν¨ν€μ§λΌκ³ λΆλ¦ λλ€. ν¨ν€μ§λ₯Ό κ΄λ¦¬νλ ν΄μ΄λΌλ μλ―Έλ νλ‘μ νΈμ κ°λ°νλ λͺ¨λ λ¨κ³μμ μ¬μ©λλ ν΄μ΄λΌλ μλ―Έμ λλ€. νλ‘μ νΈ κ°λ°μ μν μ»΄νμΌ, νλ‘μ νΈ μ 체 λΉλ, μΈλΆ ν¬λ μ΄νΈ(λ¬μ€νΈμμλ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¬λ μ΄νΈλΌκ³ λΆλ¦ λλ€) λ€μ΄λ‘λ, μ€ν νμΌ μ€μΉ λ±λ± κ°λ° κ³Όμ μ λͺ¨λ μΌμ μ²λ¦¬ν μ μμ΅λλ€. λ³΄ν΅ λ€λ₯Έ μΈμ΄μμλ λ³λμ ν΄μ μ¬μ©ν΄μΌλλ μ½λ μ£Όμμ λ¬Έμννλ κΈ°λ₯μ΄λ μ½λ μ λ ¬ λ±μ κΈ°λ₯λ€λ μμ΅λλ€.
κ·Έλ¦¬κ³ help λ©μΈμ§μ λμ€λ λͺ
λ Ήμ΄ λ¦¬μ€νΈκ° λͺ¨λ λͺ
λ Ήμ΄μ 리μ€νΈκ° μλλλ€. μ£Όλ‘ λ§μ΄ μ¬μ©λλ λͺ
λ Ήμ΄λ€λ§ 보μ¬μ£Όκ³ μμ΅λλ€. μ 체 λͺ
λ Ήμ΄ λ¦¬μ€νΈλ₯Ό λ³΄λ €λ©΄ cargo --list
λͺ
λ Ήμ μ¬μ©ν©λλ€.
user@AL02279337 quick-guide-rust-programming % cargo --list
Installed Commands:
add Add dependencies to a Cargo.toml manifest file
b alias: build
bench Execute all benchmarks of a local package
build Compile a local package and all of its dependencies
c alias: check
check Check a local package and all of its dependencies for errors
clean Remove artifacts that cargo has generated in the past
clippy Checks a package to catch common mistakes and improve your Rust code.
config Inspect configuration values
d alias: doc
doc Build a package's documentation
expand
fetch Fetch dependencies of a package from the network
fix Automatically fix lint warnings reported by rustc
fmt Formats all bin and lib files of the current crate using rustfmt.
generate-lockfile Generate the lockfile for a package
git-checkout This command has been removed
help Displays help for a cargo subcommand
info Display information about a package in the registry
init Create a new cargo package in an existing directory
install Install a Rust binary
locate-project Print a JSON representation of a Cargo.toml file's location
login Log in to a registry.
logout Remove an API token from the registry locally
metadata Output the resolved dependencies of a package, the concrete used versions including overrides, in machine-readable format
miri
new Create a new cargo package at <path>
owner Manage the owners of a crate on the registry
package Assemble the local package into a distributable tarball
pkgid Print a fully qualified package specification
publish Upload a package to the registry
r alias: run
read-manifest Print a JSON representation of a Cargo.toml manifest.
remove Remove dependencies from a Cargo.toml manifest file
report Generate and display various kinds of reports
rm alias: remove
run Run a binary or example of the local package
rustc Compile a package, and pass extra options to the compiler
rustdoc Build a package's documentation, using specified custom flags.
search Search packages in the registry. Default registry is crates.io
t alias: test
test Execute all unit and integration tests and build examples of a local package
tree Display a tree visualization of a dependency graph
uninstall Remove a Rust binary
update Update dependencies as recorded in the local lock file
vendor Vendor all dependencies for a project locally
verify-project Check correctness of crate manifest
version Show version information
yank Remove a pushed crate from the index
νΉμ λͺ
λ Ήμ΄μ λν λ³΄λ€ μμΈν μ€λͺ
μ λ³΄κ³ μΆμΌλ©΄ cargo help λͺ
λ Ήμ΄
λ₯Ό μ¬μ©ν©λλ€. 리λ
μ€μ 맀λ΄μΌ νμ΄μ§μ λμΌν ννμ 맀λ΄μΌμ λ³Ό μ μμ΅λλ€.
user@AL02279337 quick-guide-rust-programming % cargo help add
CARGO-ADD(1) General Commands Manual CARGO-ADD(1)
NAME
cargo-add β Add dependencies to a Cargo.toml manifest file
SYNOPSIS
cargo add [options] crateβ¦
cargo add [options] --path path
cargo add [options] --git url [crateβ¦]
DESCRIPTION
This command can add or modify dependencies.
......
λ€μλΆν° μ κ° κ°λ°νλ©΄μ μμ£Ό μ¬μ©νλ λͺ λ Ήμ΄λ€μ μ§§κ² μκ°νκ² μ΅λλ€.
νμ¬ λλ ν 리μ μλ‘μ΄ ν¨ν€μ§λ₯Ό μν λλ ν 리λ₯Ό λ§λ€κ³ , Cargo.toml νμΌκ³Ό .gitignore νμΌ λ± κ°λ°μ μμνκΈ° μν΄ νμν νμΌλ€μ μλμΌλ‘ μμ±ν΄μ€λλ€. κ°μ₯ λ§μ΄ μ¬μ©νλ μ΅μ
μ 2κ°μ§ -bin
κ³Ό --lib
μ
λλ€. --bin
μ΅μ
μ μ€ν νμΌμ λ§λ€κΈ°μν ν¨ν€μ§λ₯Ό μμ±ν©λλ€. μ§κΈ μμ νμΌλ€μ ꡬ쑰λ₯Ό 보면 μ λΆ src/main.rsνμΌμ κ°μ§κ³ μμ΅λλ€. μ€ν νμΌμ λ§λ€κΈ° μν ν¨ν€μ§μ΄κΈ° λλ¬Έμ --bin
μ΅μ
μ μ΄μ©ν΄μ λ§λ€μ΄μ‘μ΅λλ€. --bin
μ΅μ
μΌλ‘ ν¨ν€μ§λ₯Ό νλ μμ±ν΄λ³΄κ² μ΅λλ€.
$ cargo new --bin bin-example
Creating binary (application) `bin-example` package
bin-example $ ls -a
. .. .git .gitignore Cargo.toml src
bin-exampleμ΄λΌλ μ΄λ¦μ ν¨ν€μ§λ₯Ό λ§λ€μμ΅λλ€. λ°μ΄λ리, μ¦ μ€ν νμΌμ λ§λ€κΈ° μν ν¨ν€μ§μ λλ€. bin-exampleλλ ν 리μλ Gitν΄μ μν .gitλλ ν 리μ .gitignoreνμΌμ΄ μμ±λμμ΅λλ€. κ·Έλ¦¬κ³ Cargoμμ μ΄ νλ‘μ νΈ κ΄λ¦¬λ₯Ό μν μ¬μ©νλ Cargo.tomlνμΌκ³Ό μμ€λ₯Ό μ μ₯ν src λλ ν λ¦¬κ° μμ±λμμ΅λλ€. src/main.rs νμΌμλ κ°λ¨ν μμ κ° λ€μ΄μμ΅λλ€.
bin-example $ cat src/main.rs
fn main() {
println!("Hello, world!");
}
--lib
μ΅μ
μ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λ€κΈ° μν ν¨ν€μ§λ₯Ό μμ±ν λ μ¬μ©ν©λλ€. src/main.rsκ° μλλΌ src/lib.rs νμΌμ μμ±ν©λλ€.
$ cargo new --lib lib-example
Creating library `lib-example` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
$ cd lib-example
lib-example $ ls -a
. .. .git .gitignore Cargo.toml src
lib-example % ls src/
lib.rs
lib.rsνμΌμ κ°λ¨ν ν¨μμ μμ μ μ λ ν μ€νΈ μμ κ° λ€μ΄μμ΅λλ€.
% cat src/lib.rs
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
μ°Έκ³ λ‘ .git λλ ν λ¦¬κ° μμ±λμλ€κ³ ν΄μ Githubμ΄λ μμ μ΄ μ¬μ©νλ μ μ₯μμ μ°κ²°λμλ€λ κ²μ μλλλ€. git remote -v
λͺ
λ Ήμ μ€νν΄λ³΄λ©΄ μλ¬΄λ° μ μ₯μλ μ€μ λμ§ μμλ€λ κ²μ νμΈν μ μμ΅λλ€. λ³ΈμΈμ΄ μ¬μ©ν μ μ₯μμ λ©λ΄μΌμ μ°Έκ³ ν΄μ μ μ₯μ μ°κ²°μ μν μ
ν
μ ν΄μ£Όμ΄μΌν©λλ€.
ν¨ν€μ§λ₯Ό μμ±νλ€λ©΄ cargo check
λͺ
λ ΉμΌλ‘ μ»΄νμΌλ¬κ° μ λλ‘ μ€μΉλμλμ§, λͺ¨λ κ°λ°μ μν νκ²½ μ
ν
μ΄ μ€λΉλμλμ§ λ±μ νμΈν΄λ³Ό μ μμ΅λλ€. μμ€ μ½λμ μλ¬κ° μλμ§κΉμ§ νμΈνκΈ° λλ¬Έμ μ¬μ€μ cargo build
λͺ
λ Ήκ³Ό μ°¨μ΄κ° μμ΄λ³΄μ
λλ€. νμ§λ§ build λͺ
λ Ήλ³΄λ€ λ¨Όμ checkλͺ
λ Ήμ λ¨Όμ μκ°νλ μ΄μ κ° μμ΅λλ€. build λͺ
λ Ήμ λ§ κ·Έλλ‘ ν¨ν€μ§λ₯Ό λΉλν΄μ μ΅μ’
μ€ν νμΌκΉμ§ μμ±νμ§λ§, check λͺ
λ Ήμ μ€ν νμΌ μμ±μμ΄ μλ¬λ§ 체ν¬ν©λλ€. κ·Έλμ checkλͺ
λ Ήμ΄ λ λΉ λ¦
λλ€. κ°λ°νλ©΄μ μλ‘ μμ±ν μ½λμ μλ¬κ° μλμ§ νμΈνκΈ° μν΄ μλμμ΄ λ§μ΄ μ»΄νμΌλ¬λ₯Ό μ€νν΄μ μ€ν νμΌμ λ§λ€μ΄λ³Έ κ²½νμ΄ μμ κ²μ
λλ€. νμ§λ§ κ·Έλ κ² μμ±λ μ€ν νμΌμ λ§€λ² μ€νν΄λ³΄μ§λ μμ΅λλ€. μ€ν νμΌμ λ§λλ μκ°λ§ λλΉλλ κ²μ
λλ€. buildλͺ
λ Ήλ³΄λ€ check λͺ
λ Ήμ λ μμ£Ό μ¬μ©νλ©΄ μ‘°κΈμ μκ°μ΄λΌλ λ μλ μ μμ΅λλ€. μΌλ§λ μκ°μ΄ μκ»΄μ§λμ§ νλ² λΉκ΅ν΄λ³΄κ² μ΅λλ€.
bin-example $ cargo check
Checking bin-example v0.1.0 (/Users/user/study/bin-example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.29s
bin-example $ cargo build
Compiling bin-example v0.1.0 (/Users/user/study/bin-example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.66s
checkλͺ λ Ήμ΄ buildμ λΉν΄ μ λ°μ μκ°λ§ μ¬μ©ν©λλ€. μ§κΈμ λ무λ κ°λ¨ν μμ λ§ λ€μ΄μκΈ° λλ¬Έμ μ€μ΄λλ μκ° μ°¨μ΄κ° λ무 λ―Έλ―Έν΄λ³΄μΌ μ μμ΅λλ€. νμ§λ§ ν¨ν€μ§μ κ·λͺ¨κ° μ‘°κΈμ΄λΌλ 컀μ§λ©΄ cargo buildλͺ λ Ήμ μκ°μ΄ λ κ±Έλ¦¬κ³ λ΅λ΅ν¨μ λλ μ μμ΅λλ€. λ¬μ€νΈ μ»΄νμΌλ¬κ° λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μν λ€μν κΈ°λ₯λ€μ κ°μ§κ³ μκΈ° λλ¬Έμ μ»΄νμΌ μκ°μ΄ λλ¦°κ±Έλ‘ μ λͺ ν©λλ€. λ¨μν λ¬Έλ² μλ¬κ° μλμ§ νμΈν λλ buildλͺ λ Ή λμ μ checkλͺ λ Ήμ μ¬μ©νλ κ²μ κΆμ₯ν©λλ€.
μ΅μ’ μ€ν νμΌμ λ§λ€κΈ° μν΄μλ build λͺ λ Ήμ μ¬μ©ν΄μΌν©λλ€. cargoλ target/debug λλ ν 리λ₯Ό λ§λ€κ³ , μμ±λ μ€ννμΌμ μ μ₯ν©λλ€. λ€μμ bin-example ν¨ν€μ§μ target/debug λλ ν 리μ μλ bin-example μ€ν νμΌμ μ€νν΄λ³Έ κ²°κ³Όμ λλ€.
bin-example $ cargo build
Compiling bin-example v0.1.0 (/Users/user/study/bin-example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.29s
bin-example $ ls target
CACHEDIR.TAG debug
bin-example $ ls target/debug
bin-example bin-example.d build deps examples incremental
bin-example $ ./target/debug/bin-example
Hello, world!
λλ ν 리 μ΄λ¦μ΄ debugμΈκ±Έ 보면 μμμλ―μ΄ build λͺ λ Ήμ μλ¬΄λ° μ΅μ λ μ£Όμ§ μμΌλ©΄ λλ²κΉ μ λ³΄κ° λ€μ΄κ° μ€ν νμΌμ λ§λλλ€. μ νμΌλ‘ μΆμν μ μλ μ€ν νμΌμ μλλλ€. λ¦΄λ¦¬μ¦ λͺ¨λμ μ€ν νμΌμ λ§λ€κΈ° μν΄μλ --release μ΅μ μ μ£Όμ΄μΌν©λλ€. λ€μμ λ¦΄λ¦¬μ¦ λͺ¨λμ μ€ν νμΌμ λ§λ€μ΄λ³Έ κ²°κ³Όμ λλ€.
bin-example $ cargo build --release
Compiling bin-example v0.1.0 (/Users/user/study/bin-example)
Finished `release` profile [optimized] target(s) in 0.84s
bin-example $ ls target/release/
bin-example bin-example.d build deps examples incremental
λλ ν 리 μ΄λ¦μ΄ releaseλ‘ λ°λμμ΅λλ€. κ·Έ μΈμ μμ±λ νμΌμ΄λ λλ ν 리 λ±μ λμΌν©λλ€.
λΉλλ‘ μμ±λ νμΌλ€μ μ§μ°κΈ°μν΄μ clean λͺ λ Ήμ μ¬μ©ν©λλ€.
bin-example $ ls
Cargo.lock Cargo.toml src target
bin-example $ cargo clean
Removed 11 files, 760.6KiB total
bin-example $ ls
Cargo.lock Cargo.toml src
μ€ν νμΌμ κ°λ¨νκ² μ€ννκΈ° μν΄μ run λͺ λ Ήμ΄ μμ΅λλ€. ν¨ν€μ§μμ μμ±νλ μ€ν νμΌμ΄ 1κ°λΌλ©΄ λ€λ₯Έ μ΅μ μ΄ νμμμ§λ§, μ¬λ¬κ°λΌλ©΄ λ€μκ³Ό κ°μ΄ --bin μ΅μ μΌλ‘ μ€ν νμΌμ μ΄λ¦μ μ§μ ν΄μ€ μ μμ΅λλ€. λ€μμ μ΄ μ± μ μμ μ½λλ₯Ό λ€μ΄λ°μ ν function_forλΌλ μ€ν νμΌμ λΉλνκ³ μ€νν΄λ³Έ κ²μ λλ€.
$ cargo build --bin function_for
Compiling my-rust-book v0.1.0 (/home/gurugio/my-rust-book)
Finished dev [unoptimized + debuginfo] target(s) in 0.17s
$ cargo run --bin function_for
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/function_for`
Hello, function_for!
3 - Fizz
5 - Buzz
6 - Fizz
9 - Fizz
10 - Buzz
κ·Έλ¦¬κ³ νλ‘κ·Έλ¨μ΄ 컀맨λ λΌμΈ μ΅μ μ λ°λ κ²½μ°μ cargo run λͺ λ Ήμ 컀맨λ λΌμΈ μ΅μ μ μΆκ°ν μ μμ΅λλ€. μλλ Clapμ΄λΌλ ν¬λ μ΄νΈμ μμ μ½λλ₯Ό μ€ννλ λͺ¨μ΅μ λλ€. μ΄ μμ λ --help, --version λ± μ΄ 4κ°μ μ΅μ μ λ°μ μ μμ΅λλ€. μ΄λ° μμ λ₯Ό κ°λ°νλ μ€μλ μλμ κ°μ΄ demoλΌλ μ€ννμΌμ μ€ννλκ² μλλΌ cargo run λͺ λ ΉμΌλ‘ λ°λ‘ μ€ννκ³ , μ΅μ λ μ λ¬ν μ μμΌλ©΄ κ°λ°μ νΈλ¦¬ν κ²μ λλ€.
$ demo --help
A simple to use, efficient, and full-featured Command Line Argument Parser
Usage: demo[EXE] [OPTIONS] --name <NAME>
Options:
-n, --name <NAME> Name of the person to greet
-c, --count <COUNT> Number of times to greet [default: 1]
-h, --help Print help
-V, --version Print version
$ demo --name Me
Hello Me!
μμ μ½λκ° --helpλΌλ μ΅μ μ μ²λ¦¬ν μ μλ€κ³ ν΄μ λ€μκ³Ό κ°μ΄ λ°λ‘ cargo run λͺ λ Ήμ --help μ΅μ μ μ£Όλ©΄ cargo runμ΄ μ²λ¦¬ν μ μλ μ΅μ λ€μ΄ μΆλ ₯λ©λλ€. μ°λ¦¬λ μμ μ½λμ --help μ΅μ μ μ λ¬νλ €λ κ²μ΄μ§ cargoμκ² --help μ΅μ μ μ λ¬νλ €λ κ²μ΄ μλκΈ° λλ¬Έμ λ€λ₯Έ λ°©λ²μ΄ νμν©λλ€.
% cargo run --help
Run a binary or example of the local package
Usage: cargo run [OPTIONS] [ARGS]...
Arguments:
[ARGS]... Arguments for the binary or example to run
Options:
--message-format <FMT> Error format
-v, --verbose... Use verbose output (-vv very verbose/build.rs output)
-q, --quiet Do not print cargo log messages
--color <WHEN> Coloring: auto, always, never
--config <KEY=VALUE> Override a configuration value
-Z <FLAG> Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
-h, --help Print help
......μλ΅
cargo run λͺ
λ Ήμμ cargo μ체μ λν μ΅μ
μ΄ μλλΌ μ€νν λ°μ΄λ리 μ€ν νμΌμκ² μ λ¬ν μ΅μ
μ λ€μκ³Ό κ°μ΄ --
μ΄νμ μ μ΄μ£Όκ²λ©λλ€. μλ μ€ν μμ λ demo --help
λ‘ μ€νν κ²°κ³Όμ λμΌν μ€ν κ²°κ³Όλ₯Ό νμΈν μ μμ΅λλ€.
$ cargo run -- --help
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/bin-example --help`
Simple program to greet a person
Usage: bin-example [OPTIONS] --name <NAME>
Options:
-n, --name <NAME> Name of the person to greet
-c, --count <COUNT> Number of times to greet [default: 1]
-h, --help Print help
-V, --version Print version
$ cargo run -- -n Gioh --count 2
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.05s
Running `target/debug/bin-example -n Gioh --count 2`
Hello Gioh!
Hello Gioh!
--
λ€μμ μ λ¬ν -n Gioh --count 2
μ΅μ
μ΄ cargoκ° μλ μμ μ½λλ‘ μ λ¬λμ μ€νλμμ΅λλ€.
νλ‘μ νΈλ₯Ό μ§ννλ€λ³΄λ©΄ λ€μν μΈλΆ ν¬λ μ΄νΈ(λΌμ΄λΈλ¬λ¦¬μ κ°μ κ°λ μ λλ€)κ° νμν©λλ€. https://crates.io/ μ¬μ΄νΈμμ κ²μν΄λ³Ό μ λ μμ΅λλ€λ§ cargo search λͺ λ Ήμ μ¬μ©ν μλ μμ΅λλ€. anyhow ν¬λ μ΄νΈλ₯Ό κ²μν΄λ³΄κ² μ΅λλ€.
bin-example % cargo search anyhow
anyhow = "1.0.94" # Flexible concrete Error type built on std::error::Error
anyhow-tauri = "1.0.0" # A crate that lets you use anyhow as a command result with the tauri framework.
anyhow_ext = "0.2.1" # Extension of anynow
anyhow-std = "0.1.4" # Wrap std APIs with anyhow error context.
spark-market-sdk = "0.6.6" # SDK for interacting with the Spark Market
sentry-anyhow = "0.35.0" # Sentry integration for anyhow.
anyhow-loc = "0.3.0" # anyhow with location
anyhow_trace = "0.1.3" # Macro which adds source location as context to anyhow errors
async-anyhow-logger = "0.1.0" # An easy crate for catching anyhow errors from an asynchronous function, and passing them to yoβ¦
ckb-sentry-anyhow = "0.21.0" # Sentry integration for anyhow.
... and 1070 crates more (use --limit N to see more)
μνλ ν¬λ μ΄νΈλ₯Ό μ°Ύμ νμλ add λͺ λ ΉμΌλ‘ ν¨ν€μ§μ μΆκ°ν΄μ€λλ€.
bin-example $ cargo add anyhow
Updating crates.io index
Adding anyhow v1.0.94 to dependencies
Features:
+ std
- backtrace
Updating crates.io index
Locking 1 package to latest compatible version
Adding anyhow v1.0.94
bin-example % grep anyhow Cargo.toml
anyhow = "1.0.94"
Cargo.toml νμΌμ anyhowμ κ°μ₯ μ΅μ λ²μ μ΄ μΆκ°λ κ²μ νμΈν μ μμ΅λλ€.
μ΅μ λ²μ μ΄ μλλΌ λ€λ₯Έ λ²μ μ μ§μ μ§μ νκ³ μΆμ λλ λ€μκ³Ό κ°μ΄ @x.y
μ κ°μ΄ λ²μ μ μ¨μ€λλ€.
% cargo add [email protected]
Updating crates.io index
Adding anyhow v1.0 to dependencies
Features as of v1.0.0:
+ std
Updating crates.io index
Locking 1 package to latest compatible version
Adding anyhow v1.0.95
λ¬μ€νΈλ‘ κ°λ°νλ€λ³΄λ©΄ μ¬μ©νκ³ μΆμ ν¬λ μ΄νΈμ μ΅μ κΈ°λ₯μ΄ νμν λκ° μμ΅λλ€. μμ§ μ΅μ λ²μ μ μΆμλμ§μκ³ μ΄μ λ§ Githubμ μ¬λΌμ¨ κΈ°λ₯μ΄ νμν λκ° μ’ μ’ μμ΅λλ€. λ¬μ€νΈκ° μμ§ μΆμλμ§ μ€λλ μΈμ΄κ° μλκ³ , μ΅κ·Όμλ νλ°νκ² κ°λ°λκ³ μκΈ° λλ¬Έμ λλ€. κ·Έλ΄λλ λ€μκ³Ό κ°μ΄ --gitμ΅μ μΌλ‘ Gihubμ ν΄λ‘ μ£Όμλ₯Ό μ λ ₯ν΄μ£Όλ©΄ Githubμ main λΈλμΉλ₯Ό λ€μ΄λ°μμ€λλ€. νμνλ€λ©΄ --branch μ΅μ μ μΆκ°ν΄μ λΈλμΉ μ΄λ¦λ μ§μ ν μ μμ΅λλ€.
$ cargo add anyhow --git https://github.com/dtolnay/anyhow.git
Updating git repository `https://github.com/dtolnay/anyhow.git`
Adding anyhow (git) to dependencies
Features:
+ std
- backtrace
Updating git repository `https://github.com/dtolnay/anyhow.git`
Locking 1 package to latest compatible version
Adding anyhow v1.0.94 (https://github.com/dtolnay/anyhow.git#8ceb5e98)
cargo add λͺ
λ Ήμμ μμ£Ό μ¬μ©λλ μ΅μ
μ€μ --features
μ΅μ
μ΄ μμ΅λλ€.
λ€μμ clap ν¬λ μ΄νΈλ₯Ό μΆκ°νλ©΄μ deriveλΌλ κΈ°λ₯μ μ¬μ©νλ λͺ
λ Ήμ
λλ€.
$ cargo add clap --features string
μ€ν ν Cargo.toml νμΌμ μ΄μ΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ clap ν¬λ μ΄νΈκ° μΆκ°λ κ²μ νμΈν μ μμ΅λλ€.
[dependencies]
clap = { version = "4.5.26", features = ["string"] }
Cargo.toml νμΌμ μμ νλ λͺ λ Ήλ€μ Cargo.tomlμ μμΌλ‘ μ§μ μμ νλ κ²κ³Ό λμΌν©λλ€. cargo add λ±μ λͺ λ Ήμ λν μ¬μ©λ²μ΄ μ κΈ°μ΅μ΄ λμ§μμΌλ©΄ Cargo.toml νμΌμ μ§μ μμ ν΄λ μκ΄μμ΅λλ€.
λ¬μ€νΈ μΈμ΄λ 곡μμ μΌλ‘ μ ν΄μ§ κ²μ μλμ§λ§ λλΆλΆ λ°λ₯΄κ³ μλ μ€νμΌ κ°μ΄λ(https://doc.rust-lang.org/nightly/style-guide/)κ° μμ΅λλ€. cargoμ fmt λͺ λ Ήμ μ¬μ©νλ©΄ μλμΌλ‘ μμ€ μ½λμ μ€νμΌμ κ°μ΄λμ λ§κ² μμ ν΄μ€λλ€. Visual Studio Codeλ± λ€μν IDEμμ λ¬μ€νΈμ μ½λ ν¬λ§·μ μλμΌλ‘ μμ ν΄μ£Όλ κ²μ΄ λ°λ‘ fmt λͺ λ Ήμ λ΄λΆμμ μ€νν΄μ£Όλ κ²μ λλ€.
μ€νμ μν΄ λ€μκ³Ό κ°μ΄ printlnμμ λΆνμν 곡백μ μΆκ°ν΄μ£Όκ³ , ;μμλ 곡백μ λ£μ΄μ£Όκ² μ΅λλ€.
bin-example $ cat src/main.rs
fn main() {
println!("Hello, world!") ;
}
μ°μ μ€νμΌ κ°μ΄λμ λ§μ§ μλ λΆλΆμ΄ μ΄λμΈμ§ νμΈν΄λ³΄κΈ° μν΄ --checkμ΅μ μ μ£Όκ³ fmt λͺ λ Ήμ μ€νν΄λ³΄κ² μ΅λλ€.
user@AL02279337 bin-example % cargo fmt --check
Diff in /Users/user/study/bin-example/src/main.rs:1:
fn main() {
- println!("Hello, world!") ;
+ println!("Hello, world!");
}
μ΄λ μ½λλ₯Ό μ΄λ»κ² μμ ν΄μ€μ§λ₯Ό 보μ¬μ€λλ€. κ·Έλ¦¬κ³ fmt λͺ λ Ήμ μ€ννλ©΄ 미리 μλ €μ€λλ‘ μμ ν΄μ€λλ€.
bin-example $ cargo fmt
bin-example $ cat src/main.rs
fn main() {
println!("Hello, world!");
}
κ°λ°μ νλ€λ³΄λ©΄ ν¨ν€μ§λ₯Ό λΉλνκ³ μ€ννλ κ²λ³΄λ€ ν μ€νΈλ₯Ό μ€ννλ κ²½μ°κ° λ λ§μ κ²μ λλ€. Cargoλ ν¨ν€μ§μ μλ λͺ¨λ ν μ€νΈλ₯Ό μ€νν μ μλ test λͺ λ Ήμ μ 곡ν΄μ€λλ€.
μ΄ μ± μμλ μ λ ν μ€νΈμ ν΅ν© ν μ€νΈλ₯Ό μ΄λμ λ§λ€μ΄μΌνκ³ μ΄λ»κ² μ€νν΄μΌν μ§λ₯Ό μκ°ν©λλ€. 무μμ ν μ€νΈν΄μΌλλμ§, μ΄λ€ ν μ€νΈλ₯Ό λ§λ€μ΄μΌνλμ§ λ± ν μ€νΈ μ체μ λν κ²μ λ³λμ μλ£λ₯Ό μ°Έκ³ ν΄μ£ΌμκΈ° λ°λλλ€.
μ λ ν μ€νΈλ λ€μκ³Ό κ°μ ννλ‘ κ° μμ€ μ½λ μμ λ§λ€μ΄μ€λλ€.
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ν
μ€νΈν¨μμ΄λ¦() {
ν
μ€νΈμ½λ
λ³΄ν΅ assertλ‘ μμνλ 맀ν¬λ‘λ₯Ό μ¬μ©ν¨: assert_eq!, assert_ne! λ±
}
}
μΌλ°μ μΌλ‘ μ§κΈκΉμ§ λ§λ€μ΄λ³Έ μ½λμ λ€λ₯Έ λΆλΆμ΄ 4κ°μ§κ° μμ΅λλ€. νλμ© μκ°νκ² μ΅λλ€.
#[cfg(test)]
: μλ μ§μ λ testsλΌλ λͺ¨λμ cargo test λͺ λ Ήμ΄ μ€νλ λλ§ λΉλνκ³ μ€ννλΌλ μλ―Έμ λλ€.mod tests
: testsλΌλ λͺ¨λμ λ§λλλ€. ν μ€νΈν¨μλ₯Ό μ νμ λ€μ΄κ°λ μ½λμ λ³λμ λͺ¨λλ‘ λΆλ¦¬ν΄μ£ΌκΈ° μν΄μ λ§λλλ€.use super::*;
: ν μ€νΈκ° μ‘΄μ¬νλ νμΌμμ μ μν ν¨μλ ꡬ쑰체 λ±μ μ¬μ©νκ² ν΄μ€λλ€.#[test]
: κ° ν μ€νΈ ν¨μλ§λ€ λ°λ‘ cargo test λͺ λ ΉμΌλ‘ μ€νλ μ μλλ‘ ν΄μ€λλ€. μ΄ νμκ° μμΌλ©΄ cargo testλ‘ μ€νν μ μμ΅λλ€.
μ΄μ μ μ°λ¦¬λ lib-exampleμ΄λΌλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λλ ν¨ν€μ§λ₯Ό μμ±ν΄λ³΄μμ΅λλ€. Cargoκ° ν¨ν€μ§λ₯Ό μμ±νλ©΄μ src/lib.rs νμΌμ κ°μ΄ μμ±ν΄μ£Όκ³ κ°λ¨ν μμ μ½λλ₯Ό λ£μ΄μ£Όμμ΅λλ€. ν΄λΉ νμΌμ μ΄μ΄μ λ€μκ³Ό κ°μ΄ println 맀ν¬λ‘ ν¨μλ₯Ό μ΄μ©ν΄μ λλ²κΉ λ©μΈμ§λ₯Ό λ£μ΄μ£Όκ² μ΅λλ€.
// lib-example/src/lib.rs
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
println!("Try 2 + 2"); // debugging message
assert_eq!(result, 4);
}
}
κ·Έλ¦¬κ³ μ°μ ν΄λΉ μ λ ν μ€νΈλ₯Ό μ€νν΄λ³΄κ² μ΅λλ€. cargo test λͺ λ Ήμ ν μ€νΈ ν¨μμ μ΄λ¦μ μ§μ ν΄μ£Όλ©΄ μ§μ λ ν μ€νΈλ§ μ€νν΄μ€λλ€.
lib-example $ cargo test it_works
Compiling lib-example v0.1.0 (/Users/user/study/lib-example)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.39s
Running unittests src/lib.rs (target/debug/deps/lib_example-89f31e00332d9f1d)
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
μ€νμ μ λμ§λ§ μ°λ¦¬κ° λλ²κΉ μ μν΄ μΆκ°ν λ©μΈμ§λ₯Ό μΆλ ₯λμ§ μμμ΅λλ€. λ€μκ³Ό κ°μ΄ --nocapture μ΅μ μ μΆκ°ν΄μ£Όλ©΄ λλ²κΉ λ©μΈμ§λ₯Ό μΆλ ₯ν μ μμ΅λλ€.
lib-example $ cargo test it_works -- --nocapture
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.01s
Running unittests src/lib.rs (target/debug/deps/lib_example-89f31e00332d9f1d)
running 1 test
Try 2 + 2
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
μ£Όμν΄μΌν κ²μ΄ μμ΅λλ€. cargo test it_works --nocapture
κ° μλλΌ μ€κ°μ --μ νλ² λ μ¨μ€μ cargo test it_works -- --nocapture
λΌκ³ μ¨μ€μΌλλ€λ κ²μ
λλ€. cargo test it_works --nocapture
λΌκ³ μ€κ°μ --μ μμ¨μ£Όλ©΄ --nocaptureλΌλ μ΅μ
μ testλͺ
λ Ήμ μ΅μ
μ΄ μλ cargoμ μ€ν μ΅μ
μΌλ‘ μκ°νκΈ° λλ¬Έμ
λλ€. λ€μμ cargoλ₯Ό μν --quiet μ΅μ
κ³Ό testλ₯Ό μν --nocapture μ΅μ
μ λ λ€ μ§μ ν΄μ μ€νν κ²μ 보μ¬μ€λλ€.
lib-example $ cargo test it_works --quiet -- --nocapture
running 1 test
Try 2 + 2
.
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
cargoλͺ λ Ήμ --quiet μ΅μ μ λ°μμ λΉλμ κ΄ν λ‘κ·Έ λ©μΈμ§λ₯Ό μΆλ ₯νμ§ μμ΅λλ€. κ·Έλ¦¬κ³ testλͺ λ Ήμ --nocapture μ΅μ μ λ°μμ λλ²κΉ λ©μΈμ§λ₯Ό μΆλ ₯ν΄μ€λλ€.
λ€μκ³Ό κ°μ΄ νΉμ ν μ€νΈ ν¨μμ μ΄λ¦μ μ§μ νμ§ μμΌλ©΄ λͺ¨λ ν μ€νΈλ₯Ό λ€ μ€νν΄μ€λλ€. λ€μ μ€ν κ²°κ³Όλ₯Ό 보면 μ€νλ κ° ν μ€νΈμ μ΄λ¦κ³Ό λͺκ°μ ν μ€νΈκ° μ±κ³΅νκ³ μ€ν¨νλμ§λ₯Ό νμΈν μ μμ΅λλ€.
lib-example $ cargo test
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.09s
Running unittests src/lib.rs (target/debug/deps/lib_example-89f31e00332d9f1d)
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests lib_example
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
ν΅ν© ν μ€νΈλ μ λ ν μ€νΈμ ννλ λμΌν©λλ€. λ¨μ§ μ λ ν μ€νΈλ κ° μμ€ νμΌλ§λ€ λ§λ€μ΄μ€λ€λ©΄ ν΅ν© ν μ€νΈλ λ³λμ testsλΌλ λλ ν 리μ λ§λ€μ΄μ€λ€λ μ°¨μ΄κ° μμ΅λλ€. lib-example μμ μμ λ€μκ³Ό κ°μ΄ tests λλ ν 리λ₯Ό λ§λ€κ³ , tests/integration_add.rs νμΌμ μμ±ν΄μ£Όκ² μ΅λλ€.
lib-example % ls tests
integration_add.rs
#[test]
fn test_integration_add() {
assert_eq!(6, lib_example::add(2, 4));
}
cargo test λͺ λ Ήμ μ€ννλ©΄ λͺ¨λ μ λν μ€νΈμ ν΅ν©ν μ€νΈλ₯Ό μ λΆ μ€νν΄μ€λλ€. λ§μ°¬κ°μ§λ‘ test_integration_addλ§ λ°λ‘ μ€νν μλ μμ΅λλ€.
lib-example $ cargo test
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.86s
Running unittests src/lib.rs (target/debug/deps/lib_example-89f31e00332d9f1d)
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/integration_add.rs (target/debug/deps/integration_add-189703c86c5c305d)
running 1 test
test test_integration_add ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests lib_example
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
μ λ ν μ€νΈμ ν΅ν© ν μ€νΈλ₯Ό μ€νν΄λ³΄μμ΅λλ€. κ·Έλ°λ° cargo test λͺ λ Ήμ μ€ννλ©΄ μ΄ 3κ°μ§ ν μ€νΈλ₯Ό μ€ννλ κ²μ λ³Ό μ μμ΅λλ€. 첫λ²μ§Έλ μ λ ν μ€νΈμ΄κ³ , λλ²μ§Έλ ν΅ν© ν μ€νΈκ° μ€νλ©λλ€. κ·Έλ¦¬κ³ λ§μ§λ§μλ Doc-testsλΌλκ² μ€νλ©λλ€. μ΄μ μ lib-exampleμμ cargo testλ₯Ό μ€ννμλ μλμ κ°μ΄ Doc-testsλΌλκ² 0κ° μ€νλμλ€λ λ©μΈμ§λ₯Ό λ³΄μ ¨μ κ²μ λλ€.
Doc-tests lib_example
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
λͺ μμ μΌλ‘ ν μ€νΈ ν¨μλ₯Ό λ°λ‘ λ§λ€μ΄μ μ€ννλ ν μ€νΈλ μμ§λ§ λ€μκ³Ό κ°μ΄ μ£Όμ μμ μμ μ½λλ₯Ό λ£κ³ λ§μΉ κ° ν¨μμ μ λ ν μ€νΈμΈκ² μ²λΌ μ€νν μλ μμ΅λλ€. λ€μ μμ λ lib-example ν¨ν€μ§μμλ src/lib.rs νμΌμ λλ€. addν¨μμ μ£Όμμ μΆκ°νκ³ , μ£Όμ μμ ν μ€νΈ μ½λλ₯Ό λ£μ΄μ€ κ²μ λ³Ό μ μμ΅λλ€.
/// '/'λ₯Ό 3κ°λ₯Ό μ¨μ μ£Όμμ λ§λ€κ³ , 첫μ€μλ ν¨μμ λν 짧μ μκ°λ₯Ό μλλ€.
///
/// 곡백 νμ€μ λ§λ ν, μ¬κΈ°μλ ν¨μμ λν μμΈν μ€λͺ
μ μλλ€.
/// μ€λͺ
μ΄ λλλ©΄ μλμ 곡백 νμ€μ λ§λ ν ```μ ```λ‘ μ½λμ μμκ³Ό λμ νμν©λλ€.
/// ν¨μλ₯Ό νΈμΆν λλ μ΄λ¦λ§ μ¨μ£Όλκ² μλλΌ ν¬λ μ΄νΈμ μ΄λ¦λ κ°μ΄ μ¨μ£Όμ΄μΌν©λλ€.
/// νμ¬ μ΄ ν¬λ μ΄νΈλ lib_exampleμ
λλ€.
///
/// ```
/// assert_eq!(6, lib_example::add(2, 4));
/// ```
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
println!("Try 2 + 2");
assert_eq!(result, 4);
}
}
μ£Όμμλ μ¨λ¨μ§λ§, ν
μ€νΈλ‘ μ¬μ©ν μ£Όμμ //
κ° μλλΌ ///
λ₯Ό μ¬μ©ν΄μΌνλκ±Έ κΈ°μ΅ν΄μ£ΌμκΈ° λ°λλλ€. κ·ΈλΌ cargo testλ₯Ό λ€μ μ€νν΄λ³΄κ² μ΅λλ€.
lib-example $ cargo test
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.25s
Running unittests src/lib.rs (target/debug/deps/lib_example-89f31e00332d9f1d)
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/integration_add.rs (target/debug/deps/integration_add-189703c86c5c305d)
running 1 test
test test_integration_add ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests lib_example
running 1 test
test src/lib.rs - add (line 8) ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.50s
λ§μ§λ§μ μ€νλ Doc-testsμ 1κ°μ ν μ€νΈκ° μΆκ°λμμ΅λλ€. ν μ€νΈμλ λ³λμ μ΄λ¦μ΄ μμΌλ ν μ€νΈ μ΄λ¦μ΄ μλλΌ ν¨μ μ΄λ¦κ³Ό μ£Όμμμ μλ ν μ€νΈ μ½λκ° μμλλ μ€ λ²νΈκ° μΆλ ₯λ©λλ€.
λ€μκ³Ό κ°μ΄ νλμ ν¨μμ ν μ€νΈκ° μ¬λ¬κ° μμ΄λ λ³κ°μ ν μ€νΈλ‘ μ€νλ©λλ€.
/// '/'λ₯Ό 3κ°λ₯Ό μ¨μ μ£Όμμ λ§λ€κ³ , 첫μ€μλ ν¨μμ λν 짧μ μκ°λ₯Ό μλλ€.
///
/// 곡백 νμ€μ λ§λ ν, μ¬κΈ°μλ ν¨μμ λν μμΈν μ€λͺ
μ μλλ€.
/// μ€λͺ
μ΄ λλλ©΄ μλμ 곡백 νμ€μ λ§λ ν ```μ ```λ‘ μ½λμ μμκ³Ό λμ νμν©λλ€.
/// ν¨μλ₯Ό νΈμΆν λλ μ΄λ¦λ§ μ¨μ£Όλκ² μλλΌ ν¬λ μ΄νΈμ μ΄λ¦λ κ°μ΄ μ¨μ£Όμ΄μΌν©λλ€.
/// νμ¬ μ΄ ν¬λ μ΄νΈλ lib_exampleμ
λλ€.
///
/// ```
/// assert_eq!(6, lib_example::add(2, 4));
/// ```
///
/// ```
/// assert_eq!(0, lib_example::add(0, 0));
/// ```
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
λ€μμ add ν¨μμ μ£Όμμ μλ ν
μ€νΈλ§ λ³λλ‘ μ€ννλλ‘ cargo test λͺ
λ Ήμ --doc add
μ΅μ
μ μΆκ°ν΄μ μ€νν κ²μ
λλ€. 2κ°μ ν
μ€νΈκ° μ€νλμλ€λ κ²μ λ³Ό μ μμ΅λλ€.
lib-example $ cargo test --doc add
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.15s
Doc-tests lib_example
running 2 tests
test src/lib.rs - add (line 12) ... ok
test src/lib.rs - add (line 8) ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.58s
μ£Όμμ ν μ€νΈλ₯Ό λ£λ κ²μ μκ°νλ©΄μ μ£Όμμ λν μ΄μΌκΈ°κΈ° λμμΌλ cargoμμ μ£Όμκ³Ό κ΄λ ¨λ κΈ°λ₯μ νλ μκ°νκ² μ΅λλ€. μΌλ¨ addμ μ£Όμκ³Ό ν μ€νΈκ° μΆκ°λ μνμμ lib-example μ½λμ μν κ·Έλλ‘ λ€μ λͺ λ Ήμ μ€νν΄λ³΄κ² μ΅λλ€.
lib-example % cargo doc --open
Documenting lib-example v0.1.0 (/Users/user/study/lib-example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
Opening /Users/user/study/lib-example/target/doc/lib_example/index.html
λΈλΌμ°μ μ λ€μκ³Ό κ°μ΄ lib_example ν¬λ μ΄νΈμ λν λ¬Έμκ° λνλ κ²μ λλ€.
μ΄ μ¬μ΄νΈλ lib-example ν¨ν€μ§ μμμλ target/doc/lib_example λλ ν 리μ μμ±λ©λλ€.
lib-example $ ls target/doc/lib_example
all.html fn.add.html index.html sidebar-items.js
μμ€ νμΌμ΄ add.rsμ μ£Όμμ λͺ¨μλμ fn.add.html νμΌμ΄ μμ±λ κ²μ λ³Ό μ μμ΅λλ€. index.htmlμμ add ν¨μλ₯Ό ν΄λ¦νλ©΄ fn.add.html νμΌμ΄ μ΄λ¦½λλ€.
cargo doc λͺ λ Ήμ ν¨ν€μ§ μ 체μ μλ λͺ¨λ μ£Όμμ λΆμν΄μ μ΄λ° λ¬Έμν μ¬μ΄νΈλ₯Ό λ§λλ μΌμ ν©λλ€. κ·Έλ¦¬κ³ https://doc.rust-lang.org/std/index.html μ κ°μ΄ λ¬μ€νΈμ ν¬λ μ΄νΈ λλΆλΆμ΄ cargo doc μΌλ‘ μμ±λ λ©λ΄μΌ μ¬μ΄νΈλ₯Ό κ°μ§κ³ μμ΅λλ€.
std ν¬λ μ΄νΈμ λ©λ΄μΌ μ¬μ΄νΈ https://doc.rust-lang.org/std/index.html λ₯Ό 보면 std μ체μ λν μ€λͺ λΆν° μμν΄μ std ν¬λ μ΄νΈμμ μ μλ νμ , λͺ¨λ, 맀ν¬λ‘ λ±λ±μ μκ°νκ³ μμ΅λλ€. μ°λ¦¬λ μ§κΈ std ν¬λ μ΄νΈλ₯Ό λ³΄λ €λκ² μλλΌ λ¬Έμνμ λν λ°©λ²μ μμλ³΄λ €λ κ²μ΄λ html λ¬Έμλ₯Ό λ³Όκ² μλλΌ μ΄λ κ² html λ¬Έμλ₯Ό μμ±νλ λ¬Έμν λ°©λ²μ μμλ΄μΌλ©λλ€. κ·Έλ¬λ std ν¬λ μ΄νΈμ 첫 νλ©΄ κ°μ₯ μμͺ½μ Crate stdλΌλ μ λͺ© λ°λ‘ λ°μ μλ SourceλΌλ λ§ν¬λ₯Ό λλ¬λ³΄κ² μ΅λλ€.
μ΄μ std ν¬λ μ΄νΈμ μμ€ μ½λ μ€μμ srd/std/lib.rs νμΌμ΄ λ³΄μΌ κ²μ
λλ€. νμΌμ 첫λ²μ§Έ μ€μ μλ μ£Όμμ //!
λ‘ μμνλ μ£Όμμ
λλ€. μ΄ μ£Όμμ μμ€ νμΌμ Markdown ν¬λ§·μ μν€ λ¬Έμλ₯Ό μ μ₯νκ² ν΄μ£Όλ μ£Όμμ
λλ€. Markdown ν¬λ§·μ κΉνλΈμ README.md νμΌμλ μ¬μ©νλ μν€ ν¬λ§·μ
λλ€. μν€ λ¬Έμμ μμ±λ²μ λν΄μλ κΉνλΈ μ¬μ΄νΈμ μλ΄ λ¬Έμ(https://docs.github.com/ko/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)λ₯Ό μ°Έκ³ νμκΈ° λ°λλλ€.
κ·Έ λ€μμΌλ‘ 보μ΄λ μ£Όμλ€μ ///
μ μ¬μ©ν κ²λ€μ
λλ€. μ°Έκ³ λ‘ //
μ κ°μ΄ /
λ₯Ό 2λ²λ§ μ¬μ©ν μ£Όμμ λ¬Έμμ λνλμ§ μμ΅λλ€. κ° ν¨μλ ꡬ쑰체, 맀ν¬λ‘, μ§μ μ μν νμ
λ±λ± νμν κ³³μ ///
λ‘ μμνλ μ£Όμμ μ¨μ£Όλ©΄ cargo doc λͺ
λ Ήμ΄ μ΄ μ£Όμμ΄ ν¨μμΈμ§ ꡬ쑰체μΈμ§ λ±μ νμ
ν΄μ μ’
λ₯λ³λ‘ λλκ³ html λ¬Έμλ‘ λ§λ€μ΄μ€λλ€.
μλλ lib-example ν¬λ μ΄νΈμ src/lib.rs νμΌμ λ€μκ³Ό κ°μ΄ λ¬Έμνλ₯Ό μν μ£Όμμ μΆκ°ν μμ μ λλ€. cargo doc λͺ λ ΉμΌλ‘ μ¬μ΄νΈλ₯Ό μμ±ν ν κ° ν¨μμ ꡬ쑰체μ μ£Όμμ΄ λ¬Έμν μ¬μ΄νΈμ λνλλ κ²μ νμΈν΄λ³΄μκΈ° λ°λλλ€.
//! # μ λͺ©μ
λλ€.
//!
//! μ΄ νμΌ μ 체μ λν μκ°λ₯Ό λ΄κ³ μμ΅λλ€.
//! * μ΄λ° Markdown λ¬Έλ²λ€μ μ¬μ©ν μ μμ΅λλ€.
/// '/'λ₯Ό 3κ°λ₯Ό μ¨μ μ£Όμμ λ§λ€κ³ , 첫μ€μλ ν¨μμ λν 짧μ μκ°λ₯Ό μλλ€.
///
/// 곡백 νμ€μ λ§λ ν, μ¬κΈ°μλ ν¨μμ λν μμΈν μ€λͺ
μ μλλ€.
/// μ€λͺ
μ΄ λλλ©΄ μλμ 곡백 νμ€μ λ§λ ν ```μ ```λ‘ μ½λμ μμκ³Ό λμ νμν©λλ€.
/// ν¨μλ₯Ό νΈμΆν λλ μ΄λ¦λ§ μ¨μ£Όλκ² μλλΌ ν¬λ μ΄νΈμ μ΄λ¦λ κ°μ΄ μ¨μ£Όμ΄μΌν©λλ€.
/// νμ¬ μ΄ ν¬λ μ΄νΈλ lib_exampleμ
λλ€.
///
/// ```
/// assert_eq!(6, lib_example::add(2, 4));
/// ```
///
/// ```
/// assert_eq!(0, lib_example::add(0, 0));
/// ```
pub fn add(left: u64, right: u64) -> u64 {
// //λ‘ μμνλ μ£Όμμ λ¬Έμνκ° λμ§ μμ΅λλ€.
left + right
}
/// ꡬ쑰체μ λ¬Έμνμ λν μμ μ
λλ€.
///
/// ꡬ쑰체μ λν μ€λͺ
μ μ μ΅λλ€.
/// λ€λ₯Έ νλͺ©μ λν λ§ν¬λ [`add`]μ κ°μ ννλ‘ μ μΌλ©΄ μλμΌλ‘ addν¨μμ λν λ§ν¬λ₯Ό μμ±ν΄μ€λλ€.
///
/// # Examples
///
/// μ΄λ κ² μ΄ κ΅¬μ‘°μ²΄λ₯Ό μ¬μ©νλ μμ λ₯Ό μ£Όμμ λ£μ μλ μμ΅λλ€. μ΄ μμ λ cargo testμμ μ€νλ©λλ€.
///
/// ```
/// let ex = lib_example::StructExample::new();
/// ```
pub struct StructExample {
/// foo νλμ λν μ€λͺ
μ μ μ΅λλ€.
pub foo: usize,
/// pubμ΄ μλ νλλ private νλμ
λλ€. μ£Όμμ μ¨λ λ¬Έμ μ¬μ΄νΈμ 보μ¬μ£Όμ§ μμ΅λλ€.
bar: Option<String>,
}
impl StructExample {
pub fn new() -> Self {
StructExample { foo: 0, bar: None }
}
}
lib-example $ cargo doc --open
Documenting lib-example v0.1.0 (/Users/user/study/lib-example)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.44s
Opening /Users/user/study/lib-example/target/doc/lib_example/index.html
user@AL02279337 lib-example %