๊ด€๋ฆฌ ๋ฉ”๋‰ด

IT’s Portfolio

[Rust] Start Rust (Day 23) - More About Cargo and Crates.io ๋ณธ๋ฌธ

Development Study/Rust

[Rust] Start Rust (Day 23) - More About Cargo and Crates.io

f1r3_r41n 2023. 11. 25. 13:59
728x90
๋ฐ˜์‘ํ˜•

๐Ÿฆ€ Rust Day 23

๐Ÿณ๏ธ More About Cargo and Crates.io

1๏ธโƒฃ ๋ฆด๋ฆฌ์ฆˆ ํ”„๋กœํ•„์„ ์ด์šฉํ•œ ๋นŒ๋“œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

  • ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฝ”๋“œ์˜ ์ปดํŒŒ์ผ์„ ๋” ์ƒ์„ธํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ์„ค์ •์˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ•„์ด ์ค€๋น„๋˜์–ด ์žˆ์Œ
    • ๊ฐ ํ”„๋กœํ•„์€ ์„œ๋กœ ๋…๋ฆฝ์  ๊ตฌ์„ฑ
  • ์นด๊ณ ์—๋Š” ๋‘ ๊ฐœ์˜ ์ฃผ ํ”„๋กœํ•„
    • cargo build : dev ํ”„๋กœํ•„
      • ๊ฐœ๋ฐœ ๊ณผ์ •์— ์ ํ•ฉํ•œ ๊ธฐ๋ณธ ์„ค์ •์„ ๊ฐ–์ถค
    • cargo build --release : release ํ”„๋กœํ•„
      • ๋ฆด๋ฆฌ์ฆˆ์šฉ ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ค์ •์„ ๊ฐ–์ถค
[profile.dev]
opt-level = 0

[profile.release]
opt-level = 3
  • dev์™€ release ํ”„๋กœํ•„์˜ ๊ธฐ๋ณธ opt-level ์„ค์ •
    • ๋Ÿฌ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ์— ์ ์šฉํ•  ์ตœ์ ํ™” ์ˆ˜์ค€์„ ์ง€์ •ํ•˜๋ฉฐ ์œ ํšจํ•œ ๋ฒ”์œ„๋Š” 0๋ถ€ํ„ฐ 3๊นŒ์ง€
      • ๋” ๋งŽ์€ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ• ์ˆ˜๋ก ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚จ
      • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž์ฃผ ์ปดํŒŒ์ผํ•  ๋•Œ๋Š” ๊ฒฐ๊ณผ ์ฝ”๋“œ๊ฐ€ ๋‹ค์†Œ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜๋”๋ผ๋„ ์ปดํŒŒ์ผ์ด ๋น ๋ฅธ ํŽธ์ด ๋„์›€์ด ๋จ
      • ๋•Œ๋ฌธ์— dev ํ”„๋กœํ•„์˜ opt-level ์„ค์ • ๊ธฐ๋ณธ๊ฐ’์€ 0
      • ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ๋Š” ์ปดํŒŒ์ผ์— ์‹œ๊ฐ„์„ ๋” ํ• ์• ํ•˜๋Š” ํŽธ์ด ๋‚˜์Œ
      • ๋•Œ๋ฌธ์— release ํ”„๋กœํ•„์˜ opt-level ์„ค์ • ๊ธฐ๋ณธ๊ฐ’์€ 3
  • ์นด๊ณ ๋Š” ํ”„๋กœ์ ํŠธ์˜ Cargo.toml ํŒŒ์ผ์— [profile.*] ์„น์…˜์ด ๋ณ„๋„ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๊ฐ ํ”„๋กœํ•„์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์„ค์ •์„ ์ ์šฉํ•จ

2๏ธโƒฃ crates.io ์‚ฌ์ดํŠธ์— ํฌ๋ ˆ์ดํŠธ ๋ฐœํ–‰ํ•˜๊ธฐ

๐Ÿค” ์œ ์šฉํ•œ ๋ฌธ์„œ ์ฃผ์„ ์ž‘์„ฑํ•˜๊ธฐ

  • ๋Ÿฌ์ŠคํŠธ๋Š” ๋ฌธ์„œํ™”๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ํ˜•์‹์˜ ์ฃผ์„์„ ์ง€์›ํ•จ
  • ๋ฌธ์„œ ์ฃผ์„(documentation comment)
    • ์ฃผ์„ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ HTML ๋ฌธ์„œ ์ƒ์„ฑ
    • ๊ณต๊ฐœ API์— ์ž‘์„ฑ๋œ ๋ฌธ์„œ ์ฃผ์„์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์คŒ
    • ํฌ๋ ˆ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€๋ณด๋‹ค๋Š” ํฌ๋ ˆ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์–ด ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์„ ์œ„ํ•จ
/// ์ฃผ์–ด์ง„ ์ˆซ์ž์— 1์„ ๋”ํ•œ๋‹ค.
/// 
/// # Examples
/// 
/// ```
/// let arg = 5;
/// let answer = my_crate::add_one(arg);
/// 
/// assert_eq!(6, answer);
/// ```

pub fn add_one(x: i32) -> i32 {
    x+1
}
  • ํ•จ์ˆ˜์˜ ๋ฌธ์„œ ์ฃผ์„
    • ๋ฌธ์„œ ์ฃผ์„์€ ์Šฌ๋ž˜์‹œ ์„ธ ๊ฐœ๋กœ ์‹œ์ž‘
    • ํ…์ŠคํŠธ ํ˜•์‹ํ™”๋ฅผ ์œ„ํ•œ markdown ๋ฌธ๋ฒ• ์ง€์›
    • ์ฃผ์„ ์ž‘์„ฑ ์•„์ดํ…œ ๋ฐ”๋กœ ์ „์— ์ž‘์„ฑํ•˜๋ฉด ๋จ
    • cargo doc ๋ช…๋ น ์‹คํ–‰ ์‹œ ํ•ด๋‹น ์ฃผ์„์„ ์ด์šฉํ•ด HTML ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ
      • cargo doc --open : ํ˜„์žฌ ํฌ๋ ˆ์ดํŠธ์˜ ๋ฌธ์„œ ์ฃผ์„์œผ๋กœ ์ƒ์„ฑํ•œ HTML ๋ฌธ์„œ ์ƒ์„ฑ ํ›„ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋ณด์—ฌ์คŒ

(1) ๋ฌธ์„œ ์ฃผ์„์— ์‚ฌ์šฉํ•˜๋Š” ์„น์…˜

  • Panics
    • ํ•จ์ˆ˜๊ฐ€ ํŒจ๋‹‰์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•จ
    • ์ด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ํŒจ๋‹‰์„ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์›์น˜ ์•Š์„ ๋•Œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•จ
  • Errors
    • ํ•จ์ˆ˜๊ฐ€ Result ํƒ€์ž…์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์–ด๋–ค ์กฐ๊ฑด์—์„œ ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ๋ช…์‹œํ•˜๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋จ
  • Safety
    • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ด ํ•จ์ˆ˜๊ฐ€ ์™œ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ˜ธ์ถœ์ž๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋‚ด์šฉ๋“ค์„ ๋ฐ˜๋“œ์‹œ ์–ธ๊ธ‰ํ•ด์•ผ ํ•จ

(2) ๋ฌธ์„œ ์ฃผ์„์„ ํ…Œ์ŠคํŠธ์— ํ™œ์šฉํ•˜๊ธฐ

  • cargo test ๋ช…๋ น ์‹คํ–‰ ์‹œ ๋ฌธ์„œ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ๋กœ ์‹คํ–‰ํ•ด ์คŒ

(3) ์•„์ดํ…œ์„ ๋ณด์œ ํ•œ ๋ฃจํŠธ๋ฅผ ์œ„ํ•œ ์ฃผ์„

  • ์•„์ดํ…œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ฃผ์„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์•„์ดํ…œ์„ ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด //! ์‚ฌ์šฉ
    • ํฌ๋ ˆ์ดํŠธ์˜ ๋ฃจํŠธ ํŒŒ์ผ(src/lib.rs)์— ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํฌ๋ ˆ์ดํŠธ๋‚˜ ๋ชจ๋“ˆ ์ „์ฒด๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆ ์•ˆ์— ์ž‘์„ฑํ•จ
//! # My Crate
//! 
//! `my crate` ๋Š” ์ผ๋ถ€ ์—ฐ์‚ฐ์„ ๋” ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ์Œ์ด๋‹ค.
  • my_crate ์ „์ฒด์— ๋Œ€ํ•œ ๋ฌธ์„œํ™” ์ฃผ์„
    • ํฌ๋ ˆ์ดํŠธ์™€ ๋ชจ๋“ˆ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•จ

๐Ÿค” pub use ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ณต๊ฐœ API ๋ฐœํ–‰ํ•˜๊ธฐ

  • ๊ณต๊ฐœ API ๊ตฌ์กฐ๋Š” ํฌ๋ ˆ์ดํŠธ๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ ๊ฐ€์žฅ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„
  • pub use ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€๋Š” ๋‹ค๋ฅธ ๊ณต๊ฐœ์šฉ ๊ตฌ์กฐ๋กœ ์•„์ดํ…œ์„ ๋‹ค์‹œ ๋…ธ์ถœ(re-exporting)ํ•  ์ˆ˜ ์žˆ์Œ
// src/lib.rs

//! # Art
//! 
//! ๋ฏธ์ˆ ํ’ˆ์„ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

pub mod kinds {
    /// RYB ์ƒ‰์ƒ ๋ชจ๋ธ์— ๋”ฐ๋ฅธ ์ฃผ ์ƒ‰์ƒ
    pub enum PrimaryColor {
        Red,
        Yellow,
        Blue,
    }

    /// RYB ์ƒ‰์ƒ ๋ชจ๋ธ์— ๋”ฐ๋ฅธ ๋ณด์กฐ ์ƒ‰์ƒ
    pub enum SecondaryColor {
        Orange,
        Green,
        Purple,
    }
}

pub mod utils {
    use crate::kinds::*;

    /// ๋‘ ๊ฐœ์˜ ์ฃผ ์ƒ‰์ƒ์„ ์กฐํ•ฉํ•ด์„œ
    /// ๋ณด์กฐ ์ƒ‰์ƒ์„ ์ƒ์„ฑํ•œ๋‹ค.
    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {
        // -- ์ƒ๋žต --
    }
}
  • kinds์™€ utils ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋œ art ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ํฌ๋ ˆ์ดํŠธ๋Š” use ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด art ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜„์žฌ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜จ ํ›„, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ •์˜๋œ ๋ชจ๋“ˆ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
use art::kinds::PrimaryColor;
use art::utils::mix;

fn main() {
    let red = PrimaryColor::Red;
    let yellow = PrimaryColor::Yellow;
    mix(red, yellow);
}
  • art ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ•ญ๋ชฉ ์‚ฌ์šฉ
  • kinds ๋ชจ๋“ˆ๊ณผ utils ๋ชจ๋“ˆ์— ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑ๋œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” art ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹˜
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•„์š”ํ•œ ์•„์ดํ…œ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋“ˆ ๊ตฌ์กฐ๋Š” ํ˜ผ๋ž€์„ ๊ฐ€์ค‘์‹œํ‚ฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, use ๊ตฌ๋ฌธ์— ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์„ ๋ชจ๋‘ ๋ช…์‹œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆํŽธํ•˜๊ธฐ๋„ ํ•จ
//! # Art
//! 
//! ๋ฏธ์ˆ ํ’ˆ์„ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

pub use self::kinds::PrimaryColor;
pub use self::kinds::SecondaryColor;
pub use self::utils::mix;
  • pub use ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด ์•„์ดํ…œ์„ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์œผ๋กœ ๋‹ค์‹œ ๋…ธ์ถœ
use art::PrimaryColor;
use art::mix;

fn main() {
    let red = PrimaryColor::Red;
    let yellow = PrimaryColor::Yellow;
    mix(red, yellow);
}
  • ๋‹ค์‹œ ๋…ธ์ถœ๋œ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
    • ์ค‘์ฒฉ ๋ชจ๋“ˆ์ด ๋งŽ์„ ๋•Œ pub use ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด ํƒ€์ž…์„ ์ตœ์ƒ์œ„๋กœ ๋‹ค์‹œ ๋…ธ์ถœํ•˜๋ฉด ํฌ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ›จ์”ฌ ํŽธ๋ฆฌํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ
    • pub use ๊ตฌ๋ฌธ ์‚ฌ์šฉ ์‹œ ํฌ๋ ˆ์ดํŠธ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜์ง€ ์•Š์Œ

๐Ÿค” crate.io ๊ณ„์ • ์ƒ์„ฑํ•˜๊ธฐ

  • cargo login [API ํ‚ค]
    • ~/.cargo/credentials ํŒŒ์ผ์— ์ €์žฅ

๐Ÿค” ์ƒˆ ํฌ๋ ˆ์ดํŠธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ๋ฐœํ–‰์— ์•ž์„œ Cargo.toml ํŒŒ์ผ์— [package] ์„น์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ํฌ๋ ˆ์ดํŠธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•จ
[package]
name = "guessing_game"
  • ํฌ๋ ˆ์ดํŠธ๋Š” ์œ ์ผํ•œ ์ด๋ฆ„์ด ํ•„์š”ํ•จ
    • ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœ ์ค‘์ด๋ผ๋ฉด ์›ํ•˜๋Š” ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด๋„ ๋จ
    • crates.io์—์„œ ๋“ฑ๋กํ•  ์ด๋ฆ„์ด ์„ ์ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด Cargo.toml ํŒŒ์ผ์˜ [package] ์„น์…˜์— ๋ฐœํ–‰ํ•  ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด ๋จ
  • ์œ ์ผํ•œ ์ด๋ฆ„๋งŒ ์ •ํ•˜๊ณ  cargo publish ๋ช…๋ น ์ˆ˜ํ–‰ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ
    • ํŠธ๋ ˆ์ดํŠธ์˜ ๋™์ž‘๊ณผ ์‚ฌ์šฉ ๊ทœ์•ฝ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์„ค๋ช… ๋ฐ ๋ผ์ด์„ ์Šค ์ •๋ณด๋ฅผ ํ•„์ˆ˜๋กœ ์ œ๊ณตํ•ด์•ผ ํ•จ
[package]
name = "guessing_game"
license = "MIT"
  • ๋ผ์ด์„ ์Šค์—๋Š” ๋ผ์ด์„ ์Šค ์‹๋ณ„์ž(license identifier) ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•จ
    • ๋ฆฌ๋ˆ…์Šค ์žฌ๋‹จ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ์ดํ„ฐ ์ต์Šค์ฒด์ธ์ง€(SPDX, Software Package Data Exchange) ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์‹๋ณ„์ž ์„ ํƒ ๊ฐ€๋Šฅ
    • SPDX์— ๋‚˜์—ด๋˜์ง€ ์•Š์€ ๋ผ์ด์„ ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋ผ์ด์„ ์Šค์˜ ๋‚ด์šฉ์„ ๋ณ„๋„์˜ ํŒŒ์ผ์— ์ž‘์„ฑํ•ด์„œ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ ํ›„ ๋ผ์ด์„ ์Šค ํ‚ค ๋Œ€์‹  ํŒŒ์ผ์˜ ์ด๋ฆ„์„ license-file ํ•ญ๋ชฉ์— ์ง€์ •ํ•จ
  • ๋Ÿฌ์ŠคํŠธ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋Š” MIT์™€ Apache-2.0 ๋“€์–ผ ๋ผ์ด์„ ์Šค๋ฅผ ์ ์šฉํ•จ
[package]
name = "guessing_game"
version = "0.1.0"
authors = ["์ž‘์„ฑ์ž ์ด๋ฆ„ <you@example.com>"]
description = "์ปดํ“จํ„ฐ๊ฐ€ ์„ ํƒํ•œ ์ˆซ์ž๋ฅผ ๋งžํžˆ๋Š” ๊ฒŒ์ž„"
license = "MIT OR Apache-2.0"
edition = "2018"

[dependencies]
  • ๋ฐœํ–‰ ์ค€๋น„๊ฐ€ ๋œ ํ”„๋กœ์ ํŠธ์˜ Cargo.toml ํŒŒ์ผ

๐Ÿค” crates.io์— ๋ฐœํ–‰ํ•˜๊ธฐ

  • ํฌ๋ ˆ์ดํŠธ ๋ฐœํ–‰์€ ์˜๊ตฌ์ ์ด๋ฏ€๋กœ ๋ฐœํ–‰ ์‹œ์—๋Š” ์ถฉ๋ถ„ํžˆ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•จ
  • ๋ฒ„์ „์€ ์ ˆ๋Œ€ ๋ฎ์–ด์“ธ ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ”๋“œ ์—ญ์‹œ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Œ
    • ๋Œ€์‹  ๋ฐœํ–‰ ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ ์—†์ด ์›ํ•˜๋Š” ๋งŒํผ์˜ ํฌ๋ ˆ์ดํŠธ๋ฅผ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿค” ๋“ฑ๋กํ•œ ํฌ๋ ˆ์ดํŠธ์˜ ์ƒˆ ๋ฒ„์ „ ๋ฐœํ–‰ํ•˜๊ธฐ

  • ํฌ๋ ˆ์ดํŠธ ์ˆ˜์ • ํ›„ ์ƒˆ ๋ฒ„์ „์˜ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ค€๋น„ํ•  ๊ฒฝ์šฐ Cargo.toml ํŒŒ์ผ์— ์ง€์ •ํ•œ ๋ฒ„์ „๊ฐ’์„ ์ˆ˜์ •ํ•ด์„œ ๋‹ค์‹œ ๋ฐœํ–‰ํ•˜๋ฉด ๋จ
    • https://semver.org/ ์˜ ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹(Semantic Versioning) ๊ทœ์น™์„ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค์Œ ๋ฒ„์ „์„ ์ ์ ˆํ•˜๊ฒŒ ์ง€์ •

๐Ÿค” cargo yank ๋ช…๋ น์„ ์ด์šฉํ•ด crates.io์—์„œ ๋ฒ„์ „ ์ œ๊ฑฐํ•˜๊ธฐ

  • ์ด์ „ ๋ฒ„์ „์˜ ํฌ๋ ˆ์ดํŠธ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์ด ์•ž์œผ๋กœ ์ด์ „ ๋ฒ„์ „์„ ์ƒˆ๋กœ ์˜์กด ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
  • ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ค‘๋‹จํ•˜๋ฉด ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋Š” ๊ณ„์†ํ•ด์„œ ํ•ด๋‹น ๋ฒ„์ „์„ ๋‚ด๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒˆ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Œ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ค‘๋‹จ์€ Cargo.lock ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋Š” ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•˜๋„๋ก ์ง€์›ํ•˜๋˜, ํ–ฅํ›„ ์ƒ์„ฑ๋˜๋Š” Cargo.lock ํŒŒ์ผ๋“ค์€ ์ค‘๋‹จ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ
  • cargo yank --vers 1.0.1
    • ํŠน์ • ๋ฒ„์ „์˜ ํฌ๋ ˆ์ดํŠธ ์ค‘๋‹จ ๋ช…๋ น
  • cargo yank --vers 1.0.1 --undo
    • ํŠน์ • ๋ฒ„์ „์˜ ํฌ๋ ˆ์ดํŠธ ์ค‘๋‹จ ์ทจ์†Œ ๋ช…๋ น

3๏ธโƒฃ ์นด๊ณ  ์ž‘์—…๊ณต๊ฐ„

  • ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ•ด์„œ ํŒจํ‚ค์ง€๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๋ ˆ์ดํŠธ๋กœ ๋‚˜๋ˆ„์–ด์•ผ ํ•  ์‹œ๊ธฐ๊ฐ€ ์˜ด
    • ์นด๊ณ ๋Š” ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…๊ณต๊ฐ„(workspaces)์ด๋ผ๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต

๐Ÿค” ์ž‘์—…๊ณต๊ฐ„ ์ƒ์„ฑํ•˜๊ธฐ

  • ์ž‘์—…๊ณต๊ฐ„์€ ๊ฐ™์€ Cargo.lock ํŒŒ์ผ๊ณผ ์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ํŒจํ‚ค์ง€์˜ ์ง‘ํ•ฉ
  • ํ•˜๋‚˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ์ž‘์—…๊ณต๊ฐ„
    • ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•จ
    • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋Š” add_one ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต
    • ๋‘ ๋ฒˆ์งธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” add_two ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต
[workspace]

members = [
    "adder",
]
  • add ๋””๋ ‰ํ„ฐ๋ฆฌ ์ „์ฒด ์ž‘์—…๊ณต๊ฐ„์˜ ์„ค์ •์„ ์ง€์ •ํ•  Cargo.toml
    • ๋‹ค๋ฅธ Cargo.toml ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ [package] ์„น์…˜์ด๋‚˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ
    • ๋Œ€์‹  [workspace] ์„น์…˜์— ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ์˜ ๊ฒฝ๋กœ adder๋ฅผ ์ถ”๊ฐ€ํ•จ
  • ์ถ”๊ฐ€ ํ›„ add ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์—์„œ cargo new ๋ช…๋ น์œผ๋กœ adder ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ ์ƒ์„ฑ
    • ์ด ์‹œ์ ์• ์„œ cargo build ๋ช…๋ น์œผ๋กœ ์ž‘์—…๊ณต๊ฐ„ ๋นŒ๋“œ ๊ฐ€๋Šฅ
add
โ”œโ”€โ”€ Cargo.lock
โ”œโ”€โ”€ Cargo.toml
โ”œโ”€โ”€ adder
โ”‚   โ”œโ”€โ”€ Cargo.toml
โ”‚   โ””โ”€โ”€ src
โ”‚       โ””โ”€โ”€ main.rs
โ””โ”€โ”€ target
  • ์ž‘์—…๊ณต๊ฐ„์€ ์ตœ์ƒ์œ„์— ํ•˜๋‚˜์˜ target ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์—ฌ๊ธฐ์— ๋ชจ๋“  ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ชจ์ž„
    • adder ํฌ๋ ˆ์ดํŠธ๋Š” ๋…๋ฆฝ์ ์ธ target ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ–์ง€ ์•Š์Œ

๐Ÿค” ์ž‘์—…๊ณต๊ฐ„์— ๋‘ ๋ฒˆ์งธ ํฌ๋ ˆ์ดํŠธ ์ƒ์„ฑํ•˜๊ธฐ

[workspace]

members = [
    "adder",
    "add-one",
]
  • [workspace] ์„น์…˜์— add-one ์ถ”๊ฐ€ ํ›„ add-one์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๋ ˆ์ดํŠธ ์ƒ์„ฑ
add
โ”œโ”€โ”€ Cargo.lock
โ”œโ”€โ”€ Cargo.toml
โ”œโ”€โ”€ add-one
โ”‚   โ”œโ”€โ”€ Cargo.toml
โ”‚   โ””โ”€โ”€ src
โ”‚       โ””โ”€โ”€ lib.rs
โ”œโ”€โ”€ adder
โ”‚   โ”œโ”€โ”€ Cargo.toml
โ”‚   โ””โ”€โ”€ src
โ”‚       โ””โ”€โ”€ main.rs
โ””โ”€โ”€ target
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ adder์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๋ ˆ์ดํŠธ add-one์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
[dependencies]

add-one = { path = "../add-one" }
  • adder/Cargo.toml ํŒŒ์ผ์— add-one ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ์ถ”๊ฐ€
    • ์นด๊ณ ๋Š” ์ž‘์—…๊ณต๊ฐ„ ์•ˆ์˜ ํฌ๋ ˆ์ดํŠธ๊ฐ€ ์„œ๋กœ ์˜์กด์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํฌ๋ ˆ์ดํŠธ ๊ฐ„ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•จ
  • cargo run -p adder
    • add ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด cargo run ๋ช…๋ น์— -p ์ธ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ž‘์—…๊ณต๊ฐ„์—์„œ ์‹คํ–‰ํ•  ํŒจํ‚ค์ง€์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•จ

(1) ์ž‘์—…๊ณต๊ฐ„์— ์™ธ๋ถ€ ํฌ๋ ˆ์ดํŠธ ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ์ž‘์—…๊ณต๊ฐ„์€ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ•˜๋‚˜์˜ Cargo.lock ํŒŒ์ผ์„ ๊ฐ–์Œ
    • ๋ชจ๋“  ์˜์กด์„ฑ์— ๋Œ€ํ•ด ๊ฐ™์€ ๋ฒ„์ „ ์ ์šฉ ๊ฐ€๋Šฅ
    • ์ž‘์—…๊ณต๊ฐ„ ๋‚ด์˜ ํฌ๋ ˆ์ดํŠธ ๊ฐ„ ํ˜ธํ™˜์„ฑ ํ™•๋ณด ๊ฐ€๋Šฅ
    • ํ•˜์ง€๋งŒ ํŠน์ • ํฌ๋ ˆ์ดํŠธ์˜ Cargo.toml ํŒŒ์ผ์— ์™ธ๋ถ€ ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—…๊ณต๊ฐ„์˜ ๋‹ค๋ฅธ ํฌ๋ ˆ์ดํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

(2) ์ž‘์—…๊ณต๊ฐ„์— ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

  • ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ cargo test ๋ช…๋ น ์‹คํ–‰ ์‹œ ์ž‘์—…๊ณต๊ฐ„ ๋‚ด์˜ ๋ชจ๋“  ํฌ๋ ˆ์ดํŠธ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•จ
  • -p ํ”Œ๋ž˜๊ทธ์— ์›ํ•˜๋Š” ํฌ๋ ˆ์ดํŠธ์˜ ์ด๋ฆ„ ์ง€์ • ์‹œ ์ž‘์—…๊ณต๊ฐ„ ๋‚ด ํ•ด๋‹น ํฌ๋ ˆ์ดํŠธ์˜ ํ…Œ์ŠคํŠธ๋งŒ ๋ณ„๋„๋กœ ์‹คํ–‰ํ•จ
  • ์ž‘์—…๊ณต๊ฐ„์˜ ํฌ๋ ˆ์ดํŠธ๋ฅผ ๋ณ„๋„๋กœ ๋ฐœํ–‰ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํฌ๋ ˆ์ดํŠธ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ cargo publish ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•จ

4๏ธโƒฃ cargo install ๋ช…๋ น์„ ์ด์šฉํ•ด crates.io์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ค์น˜ํ•˜๊ธฐ

  • cargo install ๋ช…๋ น ์ด์šฉ ์‹œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ๋ฅผ ๋กœ์ปฌ์— ์„ค์น˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ช…๋ น์œผ๋กœ ์„ค์น˜ํ•œ ๋ชจ๋“  ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋ฃจํŠธ์˜ bin ํด๋”์— ์„ค์น˜๋จ
    • rustup์„ ์ด์šฉํ•ด ๋Ÿฌ์ŠคํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋ณ„๋„๋กœ ์„ค์ •์„ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” $HOME/.cargo/bin ์ž„
    • ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ $PATH ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ด์•ผ์ง€ ์„ค์น˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

5๏ธโƒฃ ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น์„ ์ด์šฉํ•ด ์นด๊ณ  ํ™•์žฅํ•˜๊ธฐ

  • $PATH ๋ณ€์ˆ˜์— cargo-something ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” cargo something๊ณผ ๊ฐ™์ด ์นด๊ณ ์˜ ํ•˜์œ„ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น์€ cargo --list๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

Summary

  • ์นด๊ณ ์™€ https://crates.io ๋ฅผ ์ด์šฉํ•ด ์ฝ”๋“œ ๊ณต์œ  ์‹œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋Ÿฌ์ŠคํŠธ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋งค์šฐ ์œ ์ตํ•จ
  • ๋Ÿฌ์ŠคํŠธ์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž‘๊ณ  ์•ˆ์ •์ ์ด์ง€๋งŒ, ํฌ๋ ˆ์ดํŠธ๋Š” ๊ณต์œ ์™€ ์žฌ์‚ฌ์šฉ์ด ์‰ฌ์šฐ๋ฉฐ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ณ„์† ๊ฐœ์„ ๋จ
728x90
๋ฐ˜์‘ํ˜•
Comments