Visual Studio Code를 이용한 Rust 개발환경 꾸며보기
20 Aug 2017러스트 개발 툴을 찾아서
러스트를 공부하면서 ‘언제쯤 괜찮은 IDE가 함께 나올까’에 대한 바램이 많이 있었더랬습니다. 러스트 1.0이 발표된 지 2년쯤이 지났고, 그동안 언어 내부에 많은 개선이 이루어져 현재 러스트 컴파일러의 버전은 1.19까지 올라갔지만, 왠지 IDE에 대한 공식적인 지원을 나서는 곳이 없었지요. 러스트에 관심을 갖고 공부하는 사람들은 왠지 다 vi 계열 혹은 emacs 계열의 에디터로 불편함없이 프로그래밍하는 고수들인가부다 하고 생각하고는 했습니다.
러스트 개발 환경을 구축해보려고 제가 써본 것들은
- Sublime text
- Visual Studio Community edition + Visual Rust
- JetBrains CLion + Intelli Rust
- Visual Studio Code (이하 VSCode) + Rust extension 정도가 있고, 현재는 VSCode를 계속 이용하고 있습니다.
Sublime text에서 제공하는 강력한 기능은 좋지만 텍스트 에디터로서의 기본적인 한계가 있었고, Visual Studio는 좋았지만 윈도우 환경 외에서 잘 사용할 수 있을지 모르겠고 (최근 MacOSX용이 나왔지만 아직 안써봐서 어떤지 잘 모르겠습니다), CLion은 크로스 플랫폼이고 기능도 강력하긴 한데 살짝 느린 감이 있었지요 (이쪽도 본격적으로 러스트를 위한 IDEA 계열 에디터용 공식 플러그인을 만든다고 발표했습니다. 이것도 좀더 기다려봐야 할 것 같아요). VSCode는 순전히 러스트 때문에 설치해본 것인데, Sublime text의 강력한 에디팅 기능을 포함하면서 매우 긴 길이의 텍스트에 대해서도 빠른 처리를 하는걸 보고 - 대략 15만줄 짜리도 금방 로딩되더군요 - 일반 텍스트 에디팅에서도 최근 가장 애용하는 에디터가 되었습니다. 심지어 공짜입니다; 저는 서브라임 정품도 구매해서 쓰고 있었는데!
VSCode + RLS
VSCode에서 사용할 수 있는 러스트용 extension 중에는 Rusty code라는 녀석과 Rust라는 녀석 두 가지가 있었는데, 이 둘은 racer와 rustfmt, rustsrc를 사용하여 코드 컴플리션과 리포맷팅 기능을 제공하고, 각종 cargo 관련 기능을 추가해 줍니다. 종종 사용하다가 보면 좌측 하단의 status bar에 racer가 crash되었다고 나오면, 재빨리 VSCode를 reload 해주면서 썼습니다 (…)
그러던 중, 최근 RLS 개발진중 한 분이 블로그에 홍보글을 썼더군요. RLS는 Rust Language Server라고 하는 것으로, 백그라운드로 실행되면서 IDE나 에디터, 혹은 다른 툴에게 개발하고 있는 러스트 프로그램에 대한 정보를 제공하는 서버입니다. 글을 훑어보시면 여러가지 매력적인 기능이 있습니다. 마우스를 심볼 위에 호버링 시키면 해당 심볼의 선언부분이 나온다던지, go to definition이라던지요.
이전에도 이 RLS는 계속 개발되고 있었고, VSCode extension 중에서 Rust를 이용하면 실험적인 feature로 RLS를 이용해볼지, 아니면 legacy 방식을 쓸지 결정하라고 물어봤었지요. 이때 한번 RLS를 써보려다가… 너무 버그가 심해서 (RLS 서버가 너무 픽픽 죽어서) 쓰질 못했었어요. 근데 블로그로 홍보를 하는 상황이 되었고, 심지어 이를 위해 직접 extension도 만들었다니까, 한번 써봐야되지 않겠습니까? 그래서 써봤습니다.
결론은, RLS analysis는 좀 오래 걸리긴 하지만, 매우 만족스럽다는 것이었습니다! 이제부터 어떤식으로 VSCode + RLS를 이용하여 개발 환경을 구축했는지에 대한 내용을 공유할까 합니다.
개발 환경 구축
Rustup 설치
- 상당히 많은 언어들이 그렇듯, 러스트도 버전 매니저가 있습니다. rustup이라고 부르는데요.
홈페이지에 가면 설치 방법이 한줄 나와 있습니다.
curl https://sh.rustup.rs -sSf | sh
- 혹시 윈도우 유저시라면, 홈페이지 하단에 other installation options라고 되어있는 링크를 타고 들어가셔서 설치 옵션을 보세요.
- rustup 없이도 러스트를 설치할 수 있지만, rustup을 이용하면 개발에 필요한 다양한 콤포넌트들을 쉽게 설치할 수 있으니, 이 방법을 이용하는 것을 강력히 추천합니다.
- rustup으로 설치를 마치셨다면, 기본적으로 현재 이용할 수 있는 stable 버전의 rustc 컴파일러 및 cargo 패키지 매니저, 그리고 러스트 문서와 표준 라이브러리가 설치되는걸 확인할 수 있습니다 (작성일 기준 1.19버전입니다).
- 덧: 만일 윈도우 유저라면, rustup을 이용하여 설치할 수 있는 환경이 두 가지입니다: visual studio 기반 혹은 mingw 기반이죠. 원하시는데로 설치하시면 됩니다. 제 경험상으로는 visual studio community edition을 설치하고 visual studio 기반으로 설치하는 쪽이 디버깅 환경 등을 이용할때 좀 더 좋았습니다.
VSCode 설치
- VSCode에 가시면 바이너리 빌드를 바로 다운받아서 설치하실수 있습니다.
- 맥 유저시라면 터미널용 명령어
code
를 사용할 수 있게 하면 정말 편해집니다. Windows랑 Linux용을 설치할 때는 자동으로 해준다고 하네요. 꼭 해두세요!
VSCode 내에 extension 설치
- VSCode에서 go to file (
ctrl + p
)를 열어서ext install rust
이라고 입력하면, 검색어에 걸리는 몇 개의 extension이 좌측 사이드 탭에 뜹니다. - 이중에서
Rust (rls)
라고 되어있는 extension을 설치하고 reload 하세요.
- 팁: command pallete (
ctrl + shift + p
)를 눌러서 reload를 검색하면 매우 빠르게 에디터 리로딩을 할 수 있어요.
러스트 프로젝트 만들고 열기
- 러스트 프로젝트를 열지 않고는 Rust (rls)의 세부 환경 세팅이 안될테니, hello world 프로젝트라도 하나 만들어봅시다.
- 터미널을 열고 다음을 입력하여 프로젝트를 만들고 VSCode로 엽니다:
$ cargo new hello_world --bin $ code ./hello_world
rustup component 설치
- 프로젝트를 성공적으로 여셨다면, VSCode에 설치된 Rust(RLS) extension이 자동적으로 현재 상태를 감지하고, 필요한 rustup component를 설치하려고 할 것입니다.
- 먼저 설치하라고 하는 것은 nightly toolchain 입니다. 현재 RLS가 nightly 버젼에서만 돌아가기 때문이지요. yes를 눌러서 설치를 진행합니다.
- 설치가 끝나고 나면, 다음으로 RLS를 설치하려고 할 것입니다. 역시 yes를 눌러서 설치를 진행합니다.
- 설치가 다 끝나고 나면, 기본적인 에디팅 환경 설정은 모두 끝난 것입니다. 좌측 하단에
RLS analysis: done
이라고 뜨면 동작을 하고 있다는 얘기입니다. - 간략한 예제를 작성하면서 테스트 해보세요. 심볼에 마우스를 갖다대면 해당 심볼의 선언 부분이 나오고,
ctrl + LMB
을 누르면 해당 심볼의 정의 부분으로 이동합니다 (go to definition). - 만약에 생각만큼 auto completion이나 go to definition 등이 잘 동작하지 않는다는 생각이 든다면, VSCode를 reload 시켜보세요 (…) 종종 이게 제일 좋은 해결책일 경우가 있습니다. 다행스러운 것은 VSCode reload가 정말 빠르게 실행된다는 것이죠 (…)
- 덧: 현재 설치된 rustup component를 보시려면 터미널에서
rustup component list
를 실행하여 볼 수 있습니다. 다만, 디폴트로 설정되어 있는 toolchain에 대한 component만 보일 것이므로,rustup default nightly
를 먼저 실행하셔야 제대로 된 리스트를 보실 수 있을 겁니다.
디버깅 환경 구축
Rust(rls) extension에서는 아직 공식적으로 디버거 연결 제공을 해주고 있지 않습니다. 대신, gdb와 (windows 환경이라면 visual studio debugger) native debugger extension을 이용하면 대충 비스무리한 환경을 만들 수 있습니다.
gdb 설치
- 맥 유저시라면, gdb 대신 lldb가 기본 디버거라서 gdb가 따로 설치되어 있지 않을 수 있습니다.
brew를 이용해서 gdb를 설치해두시기 바랍니다.
$ brew install gdb
- 현재의 macosx 버전에서는 gdb에 코드사인이 되어 있어야 정상적으로 동작합니다. 여기를 참고하셔서 gdb에 코드사인 작업을 하셔야 합니다.
- 또한 맥 유저라면 brew로 gdb을 설치한 뒤에 아래 메세지가 안내됩니다. 그대로 따라하셔서
gdb 기본 설정을 해줘야 합니다:
$ echo "set startup-with-shell off" >> ~/.gdbinit
VSCode native debug extension 설치
- 이 gdb를 VSCode에 연결해 주려면 Native Debug extension이 필요합니다.
ctrl + p
를 눌러서 명령창을 열고ext install native-debug
를 입력하시면 좌측 사이드 탭에 Native Debug를 검색하실 수 있습니다. 이걸 인스톨합니다. - reload를 하고 나서 이제 왼쪽 사이드 툴바에서 디버그 탭을 선택한 다음, 왼쪽 사이드 탭 상단에 있는 디버그 시작 아이콘을 누르면 새로운 디버깅 환경 세팅을 위한 메뉴가 뜹니다. 여기서 gdb를 선택해줍니다.
- 디버깅 환경을 선택하면 프로젝트 루트 디렉토리 밑에 있는
.vscode
라는 디렉토리 안에launch.json
이라는 파일이 생기고, 여기에 자세한 디버깅 환경을 세팅할 수 있습니다. 우리가 해줘야 할 일은target
에 디버깅용 실행 파일 이름을 적어주는 것입니다. - 여기서 주의해야할 사항은, 현재 맥에서는 gdb을 이용한 디버깅이 왠지 최종 파일인
./target/debug/{project_name}
을 설정해주면 심볼 데이터를 잘 읽어들이지 못한다는 점입니다. 그럴때는./target/debug/dep/{project_name}_{뭔가 긴 해쉬코드}
파일을 찾아서 이 이름을 적어주세요. 혹시 같은 이름의 파일이 여러 개라면,cargo clean
후cargo build
를 다시 실행시키면 현재 이용하고 있는 하나만 나올 것입니다:{ "name": "Debug", "type": "gdb", "request": "launch", "target": "./target/debug/deps/hello_world-51d02c6c0c01c7ba", "cwd": "${workspaceRoot}" }
- 이제 코드에 브레이크 포인트를 설정하고 디버그 모드를 실행시키면, 어느정도 동작하는 모습을 확인할 수 있습니다. 로컬 스코프의 변수를 자동으로 찾아서 채워주거나 하지는 않지만, 커서를 심볼에 갖다대면 현재 어떤 값을 갖고 있는지 확인할 수 있고, gdb에 익숙하신 분들이라면 debug console을 그대로 이용할 수도 있습니다:
- 덧: 그냥 gdb를 이용하여 심볼 안의 데이터를 보면 타입 이름이 전부 적혀있어서 엄청 지저분합니다;
다행히 이걸 조금이라도 더 깔끔하게 보여줄 방법이 있습니다.
~/.gdbinit
을 열어서 아래처럼 작성하고 저장하시면, gdb 상에서 좀더 깔끔하게 정리된 (그러나 여전히 json 비스무리해서 보기 그렇게 깔끔하진 않은) 데이터를 볼 수 있습니다! 아래에${여러분의_홈디렉토리}
부분과nightly-x86_64-apple-darwin
부분 등 디렉토리 설정과 관련된 부분은 여러분의 상황에 맞게 고치셔야 합니다!set startup-with-shell off python print "--Loading Rust pretty-printers--" sys.path.insert(0, "${여러분의_홈디렉토리}/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/etc") import gdb_rust_pretty_printing gdb_rust_pretty_printing.register_printers(gdb) end
정리
종종 VSCode + Rust(RLS)가 말을 안듣고 좀 불안하긴 하지만, 제가 이제까지 본 중 가장 쾌적한 러스트 개발 환경이 아닐까 싶습니다. VSCode랑 Rust(RLS)가 말을 안들으면 재빨리 reload하면 되고(…) 타이핑 할 때 느려지는 문제는 거의 없으며, Sublime text와 같은 강력한 멀티 커서 기능, 어느 정도 수준 이상으로 동작하는 코드 리팩터링 기능, 리포매팅 기능 등 필요한 건 어느정도 다 갖춘 상태입니다. 거기에 예쁘게 나오진 않지만 gdb를 이용해서 디버거 연결도 됩니다!
추후에 공식으로 나올 IntelliJ Rust도 기대하는 중입니다 후후후