본문 바로가기
컴퓨터/러스트(Rust)

러스트 프로그래밍(Rust programming): 2 카고(cargo)

by All That Guy 2016. 5. 4.

2  러스트 프로그래밍(Rust programming): 카고(Cargo)






러스트를 설치하면 Cargo라 는 도구도 같이 설치를 한다. 카고는 여러 의존 파일 등을 관리하고 언제든지 반복해서 프로그램을 만들 수 있도록하는 아주 유용한 도구다. 앞에서처럼 간단하게 바로 프로그램을 작성해서 컴파일을 하고 실행할 수도 있지만, 조금씩 복잡해지면 이런 관리도구가 아주 쓸모가 많다.



2.1 카고로 프로젝트 만들기



바로 카고를 이용해 보자. 앞서 만든 Hello, world!를 카고를 이용해서 만들어 본다.



$ mkdir development
$ cd development
$ mkdir projects
$ cd projects



우선 projects라는 디렉토리를 만들었다. 앞으로 카고를 이용한 러스트 프로그래밍은 프로젝트 디렉토리에서 한다.



$ cargo new hello_world --bin



new는 새로운 프로젝트를 개시한다는 뜻이고, hello_world는 프로젝트 이름이다. --bin은 라이브러리가 아니라 바이너리를 만든다는 뜻이다. 이렇게 하면 카고는 projects 디렉토리에 hello_world라는 디렉토리를 만들고 그 디렉토리 안에 여러 파일을 자동으로 생성을 해 놓는다. 리눅스/OSX에서는 tree 명령어로 디렉토리 하부 구성을 한 눈에 볼 수 있다.



2.2  카고 구성



$ development/projects/hello_world/tree
.
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files



2.3  Cargo.toml



우선 기본인 Cargo.toml를 보자. Cargo.toml에서 C는 반드시 대문자 C여야 한다. toml 확장자는 Tom's Obvious, Minimal Language 형식이라는 뜻이다. 이는 *.ini과 비슷하지만 조금 더 다른 좋은 기능이 있고, 카고에서는 이를 설정 형식으로 쓴다.

편집기로 Cargo.toml를 열면 다음과 같은 정보를 볼 수 있다.



[package]
name = "hello_world"
version = "0.1.0"
authors = ["사용자 이름"]

[dependencies]



첫 째 줄 [package]는 그 이하 문구가 해당 패키지를 설정한다고 지정을 한다. 그 아래 [dependencies]는 의존 내역 설정인데, 이 프로젝트에서는 해당 사항이 없고 패키지 설정만 지정한다.

[package] 아래 세 줄에 있는 (파일) 이름(name)판 번호(version), 작성자(authors)는 해당 프로그램을 카고가 컴파일 할 때 필요한 내용이다.



2.4  src/main.rs



우리가 작성하는 프로그램은 src(source) 디렉토리에 main.rs 파일로 저장을 한다. cargo에서는 어떤 프로젝트, 어떤 프로그램이든 주 프로그램은  main.rs이다. Hello, world!도 여기에 작성을 한다. 그런데 main.rs는 빈 파일이 아니라 그 안에 이미 내용이 있다. 바로 앞서 작성한 Hello, world! 소스파일이다. cargo new ... 로 프로젝트를 만들면 Hello, world! 코드를 기본으로 생성한다. 시작점이다. 이 소스 파일을 편집해서 쓰면 된다.



2.5  cargo build



이제 Hello, world!를 컴파일 해 보자.


$ development/projects/hello_world/cargo build
   Compiling hello_world v0.1.0 (file:///...development/projects/hello_world)
$




위처럼 나온다면 성공적으로 컴파일을 마쳤다.


$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
        ├── build
        ├── deps
        ├── examples
        ├── hello_world
        └── native

7 directories, 4 files



파일과 디렉토리가 늘어났다. ~/target/debug 디렉토리에 약간 색이 다른 파일 hello_world가 컴파일 하여 생성한 실행 파일이다. 이 파일을 실행을 해 보자.


$ ./target/debug/hello_world
안녕하세요! Hello, world!



이처럼 나온다면 축하한다. cargo를 이용하여 rust로 hello_world 프로젝트를 성공적으로 마쳤다.



2.6   cargo run



cargo build./target/debug/hello_world 두 과정을 거치지 않고, 바로 한 단계로 할 수 있다.


$ .../development/projects/hello_world/cargo run
     Running `taget/debug/hello_world`
안녕하세요! Hello, world!



바로 성공이다. 혹시 cargo build와 차이점을 발견했는가? 위 예문에서는 main.rs를 컴파일 하지 않았다. 이미 컴파일을 하였고, 변경 사항이 없으면, 카고는 다시 컴파일을 하지 않고, 이미 만든 실행 파일을 실행한다. 당연하게 만약 소스 코드를 고쳐서 저장을 하면 카고는 컴파일을 다시 하고 프로젝트를 새로 만들어 결과물을 실행한다. 

cargo build를 하지 않고 바로 cargo run을 실행하거나 소스 코드를 바꿨다면 다음과 같다.


$ cargo run
   Compiling hello v0.1.0 (file:///.../development/projects/hello_world)
     Running `target/debug/hello_world`
안녕하세요! Hello, world!
$



아직까지는 rustc로 바로 소스 코드를 컴파일하기와 cargo를 사용하여 프로젝트를 만들기에 차이가 없어서, 카고 사용이 번거롭게 여겨질 수도 있다. 프로젝트가 커지고 크레이츠(crates, 라이브러리 또는 패키지를 러스트에서는 크레이츠라고 부른다)를 여럿 사용하여 복잡해질 때 카고가 이 모든 걸 관리하게 하면 작업을 훨씬 수월하게 할 수 있다.



2.7  개발 발표(building for release)



개발 중인 프로젝트를 완성하여 발표할 준비가 되었을 때에는 cargo build -release로 최적화 하여 컴파일을 할 수 있다. 이 최적화 과정은 러스트 코드를 더 빨리 실행하게 할 수 있으나, 컴파일 시간 또한 더 오래 걸린다. 작업 완료 후 발표를 할 때 cargo build --release를 사용 하면 유용하다.



2.8  Cargo.lock



cargo build를 실행하고 tree로 파일과 디렉토리 구성을 보면, 카고는 Cargo.lock이라는 파일 또한 생성해 놨다. 이 파일을 보면 다음과 같다.


[root]
name = "hello_world"
version = "0.1.0"



이는 카고가 해당 소프트웨어의 의존 파일들을 관리하기 위한 파일이다. hello_world 프로젝트에서는 의존 파일이 없으므로 Cargo.lock이 빈약해 보인다. 실제 작업시에는 이 파일에 손을 댈 일이 없다. 카고가 알아서 하게끔 건드리지 않고 내버려 두면 된다.



2.9 소스 가져와서 쓰기


$ git clone some.url/foo
$ cd foo
$ cargo build



2.10 


여기까지 러스트를 쓸 수 있는 대략적인 방법을 모두 기술하였다. 이제부터는 다양한 러스트 문법을 더 자세히 익히며 예제를 통해서 러스트 프로그래밍을 많이 익히면 된다.



※ 작성 참고 및 편역 문헌: "The Book," The Rust Programming Language