기존 프로젝트를 새로운 에디션으로 전환시키기

새로운 에디션들은 아마 여러분이 Rust 코드를 짜는 방식을 변화시킬 것입니다. - 새로운 에디션들은 새로운 문법, 언어 요소, 라이브러리와 함께 찾아오고, 몇몇 기능들은 삭제되기도 하기 때문이죠. 예를들면, try, async, 그리고 await등등의 키워드들이 Rust 2018에디션에 추가될 예정입니다. 그렇지만 이 키워드들은 Rust 2015 에디션에는 들어있지 않죠. 만약 여러분의 프로젝트가 Rust 2015를 사용하고 있고 여러분이 이제부터 Rust 2018에디션을 사용하자고 하신다면, 아래와 같이 하시면 됩니다!

우리는 새로운 에디션으로의 전환이 최대한 쉽도록 노력하고 있습니다. 우리는 Rust 2018로 업그레이드하는 것이 여러분에게 어렵게 느껴진다면, 그것이 버그때문일지도 모른다고 생각합니다. 만약 여러분이 업그레이드를 하는 과정 중에 문제가 발생한다면 버그 신고, 여기에 신고해 주세요!.

여기 예시가 있습니다. 우리가 이 trait을 가지고 있다고 해 봅시다. src/lib.rs:


# #![allow(unused_variables)]
#fn main() {
trait Foo {
    fn foo(&self, Box<Foo>);
}
#}

이 코드는 익명 parameter를 사용합니다. 바로 Box<Foo>이죠. 이 기능은 Rust 2018에서는 지원되지 않습니다 따라서, Rust 2018에디션에서는 컴파일 에러를 발생시킬 것입니다. 여러분이 Rust 2018을 사용하고 싶으시다면 이런 코드들을 빨리 업데이트하셔야겠죠?

여러분의 코드를 새로운 에디션에 맞춰서 업데이트시키세요

여러분의 코드는 새로운 에디션과 호환되지 않는 기능들을 사용하고 있을수도, 사용하고 있지 않을수도 있습니다. Rust 2018로의 전환을 돕기 위해서 우리는 Cargo에 새로운 Subcommand를 추가하였습니다. 아래에 있는 명령을 실행시켜보시죠.

> cargo fix --edition

이 명령어는 여러분의 코드를 체크해보고 자동적으로 모든 이슈들을 수정할것입니다 (할수 있는 범위 내에서요) 이 명령어를 실행하고 난 다음, src/lib.rs에 있는 코드가 어떻게 바뀌어 있나 봐볼까요?


# #![allow(unused_variables)]
#fn main() {
trait Foo {
    fn foo(&self, _: Box<Foo>);
}
#}

이 명령어가 이 Trait object의 parameter name을 위해서 코드를 수정했네요! 이 경우에는, 그 전의 이름이 없는 관계로, cargo fix가 이름을 _로 대체했습니다. (사용되지 않는 변수이름들을 나타내기 위한 표현이죠)

cargo fix는 등장한지 얼마되지 않았기 때문에, 여러분의 모든 코드를 자동적으로 고쳐줄수 있는 단계에 있지는 않습니다. 만약 cargo fix가 고치지 못하는 무언가가 있다면, 그에 맞는 warning이 출력될 것입니다. 만약 여러분이 이러한 warning들을 보게 된다면, 여러분이 직접 그 코드들을 수정해야 합니다. 이 가이드에는 이를 위한 섹션이 있으니 그 부분을 읽어보시길 바랍니다. 또한, 만약 여러분이 이와 관련된 문제를 겪고 있다면 유저 포럼에 가보시는 것도 고려해 보세요.

여러분이 그 어떠한 warning도 받지 않을 때까지 cargo fix --edition을 계속 실행해 보세요.

그러면.. 축하드립니다! 여러분의 코드는 이제 Rust 2018과 Rust2015 모두에서 사용가능합니다.

새로운 기능들을 사용하기 위해서 새로운 에디션 사용하기

여러분이 새로운 기능들을 사용하고 싶으시다면, 명시적으로 그것을 밝혀줘야만 합니다. 여러분이 준비가 됐다 싶으시면, 새로운 에디션을 사용하기 위해서 Cargo.toml파일을 수정하세요. 예를 들면,

[package]
name = "foo"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
edition = "2018"

만약에 edition키가 파일 안에 없다면, Cargo는 자동적으로 Rust 2015 에디션을 사용할것입니다. 그렇지만, 이 경우에는 우리가 2018에디션을 사용하겠다고 명시적으로 밝혔기 때문에, 우리의 코드는 Rust 2018 에디션으로 컴파일될 것입니다!

새로운 에디션에서 idiomatic한 코드 짜기

에디션들은 단순히 새로운 기능을 추가하는 것과 오래된 기능들을 제거하는것들에만 관한것이 아닙니다. 어떠한 프로그래밍 언어에서든 idiomatic한 코드는 시간에 따라 변화하죠. 또한 Rust라고 그에 대한 예외일 수는 없습니다. 오래된 idiomatic 코드들이 계속 컴파일 되긴 하겠지만, 그것이 새로운 에디션에서도 idomatic한 코드일것이란 보장은 없습니다.

여기 이제는 구식이 되어버린 옛날의 idiomatic한 코드가 있네요. (어디서 본것 같죠?)


# #![allow(unused_variables)]
#fn main() {
trait Foo {
    fn foo(&self, _: Box<Foo>);
}
#}

Rust 2018 에디션에서는 trait object에 dyn 키워드를 쓰는 코드가 idiomatic한 코드입니다.

최종적으로는 우리는 cargo fix가 이러한 모든 idiom들을 자동적으로 업그레이드 하게 되는 것을 바라고 있습니다. 그렇지만, 지금 현재로서는 "idiom lints"가 아직 자동화되지 않았습니다. Rust 컴파일러는 cargo fix와 연동되어서 수정 제안점들을 제시해야하지만 그러지 못하고 있죠. 몇몇 경우에서는 오히려 잘못된 제안을 하기도 하고요. idiom lint를 사용하는 것은, 심지어 cargo fix와 함께 사용되더라도, 아마도 여러분의 crate가 작동하지 못하도록 만들어버리거 또는 전혀 아무런 것도 고치지 못한채 그대로 내버려 둘 수 있습니다. 우리는 이러한 idiom들을 업그레이드 하는 것 뿐만 아니라 전체적인 Rust 2018로의 전환이 매우 쉽게 이루어지도록 하기 위한 작업중에 있습니다만 아직 그 작업이 완료되지는 않았습니다. 따라서 여러분이 컴파일러/Cargo 버그들과 맞닥뜨리고 그것을 수정할 수 있으신 경우에만 아래의 명령을 실행시키세요.

$ cargo fix --edition-idioms

명령을 실행시키고 나면, src/lib.rs에 있는 코드는 다음과 같이 보일 것입니다.


# #![allow(unused_variables)]
#fn main() {
trait Foo {
    fn foo(&self, _: Box<dyn Foo>);
}
#}

훨신 idiomatic하네요! 또한 직접 코드를 수정해야하는 수고도 덜었고요.

그리고 cargo fix가 여전히 여러분의 모든 코드들을 업데이트하지 못할 수 있다는 것을 알아두세요. 만약 cargo fix가 고치지 못하는 무언가가 있다면 단순히 그에 따른 warning을 콘솔 화면에 출력할 것이고 여러분은 그것들을 직접 고치시면 됩니다.

이 전에 언급했던대로, 아직 idiom lints에는 많은 버그들이 산재해있습니다. 아직 실제 사용되어질수 있을만한 수준에 이르지는 못했다는 뜻이죠. 여러분은 rustc가 제안한 수정 사항이 실제로 적용되고 그것이 컴파일 에러로 이어졌을때라면 언제든지 Cargo로부터 굉장히 무시무시한 warning을 받을 수 있는데요, 만약 어려분이 cargo fix로 하여금 할 수 있는 한에서는 최대한 수정을 하게 하고 싶으시다면, 아래의 명령어를 실행시키실수 있습니다. (그렇지만, 컴파일 에러를 일으킬수도 있어요!):

$ cargo fix --edition-idioms --broken-code

이 명령어는 cargo fix로 하여금 자동적으로 추천 수정사항들을 그것들이 실제로 정상작동하는지 아닌지 여부에 관계없이 적용하도록 합니다. 언제나처럼 여러분은 모든 수정사항들이 적용된 뒤에 컴파일 결과를 보게 될 것이고요, 만약 여러분이 무언가 이상하거나 잘못된 것을 발견하신다면, 주저하지 마시고 Cargo team에게 신고를 해주세요. 우리는 신고받은 것들을 검토하고 고칠것입니다.

부디 여러분이 Rust의 새로운 에디션을 즐기시길 바랍니다!