Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rust 릴리스 채널 구성

참고 이 문서는 규범적인 문서가 아니라 서술적인 문서로 보아야 하며, 아직 완성되지 않았습니다. 여기에 설명된 내용이 모두 정확하다거나, 일을 어떻게 해야 하는지 정의한다고 여기지 마십시오.

이 문서의 내용 중 상당 부분은 2016년에 Brian Anderson이 Rust internals 포럼에 올린 게시물에서 가져왔습니다.

Rust 릴리스는 static.rust-lang.org에 배포되며, 이곳에서 저희 CDN을 거쳐 https로 제공됩니다. 릴리스 채널(stable, beta, nightly)은 여러 부분으로 이루어져 있지만, 모두 매니페스트 파일 하나에서 출발합니다.

채널 매니페스트

manifests.txt 파일에는 지금까지 게시된 채널 매니페스트의 경로가 나열되어 있습니다.

채널 매니페스트는 최상위 디렉터리 /dist/에 들어 있습니다. 매니페스트 파일의 이름은 channel-rust-[channelname].toml입니다. 각 채널 매니페스트에는 .sha256 파일이 함께 제공됩니다. 이 파일은 매니페스트 파일의 체크섬으로, 다운로드한 데이터의 무결성을 확인하는 데 사용할 수 있습니다. 또한 각 채널의 매니페스트에는 .asc 파일도 함께 제공됩니다. 이 파일은 분리된 GPG 서명으로, 채널 매니페스트의 무결성뿐 아니라 진위도 확인하는 데 사용할 수 있습니다.

stable, beta, nightly 채널 외에 각 릴리스마다 channel-rust-x.yy.z.toml이라는 이름의 매니페스트도 있으며, 이 매니페스트에도 해당하는 .sha256 파일과 .asc 파일이 함께 제공됩니다.

날짜 기반 채널을 지원하기 위해 날짜마다 아카이브 폴더(YYYY-MM-DD 형식의 이름)가 있으며, 이 폴더에는 그날의 필요한 채널 파일 사본이 들어 있습니다. 예를 들어 nightly-2019-02-16을 설치했다면 채널 파일은 https://static.rust-lang.org/dist/2019-02-16/channel-rust-nightly.toml입니다.

채널 매니페스트의 내용

채널 매니페스트는 toml 파일입니다. 이를 v2 매니페스트라고 부릅니다. v1 매니페스트는 릴리스에 포함된 파일을 나열한 목록일 뿐이며, 모든 채널에서 항상 생성되지는 않습니다. 현재는 v2 매니페스트만 사용할 것을 권장하며, 이 절에서도 이 매니페스트를 다룹니다.

.toml 파일의 최상위에는 중요한 키/값 쌍이 두 개 있습니다. 첫째는 manifest-version으로, 현재 값은 "2"입니다. 둘째는 매니페스트의 날짜(date)로, 값은 "YYYY-MM-DD" 형식입니다.

그 밖에 최상위 섹션(테이블)이 여러 개 있으며, 다음과 같습니다.

  • pkg - 매니페스트 내용의 대부분을 차지하며, 릴리스에 포함된 패키지를 나열합니다. 보통 rust, rustc, cargo 같은 패키지가 여기에 들어갑니다. rust 패키지는 다소 특별한 패키지로, 현재는 다른 패키지 중 기본으로 설치할 패키지를 지정하는 데 사용됩니다.

    패키지 안에는 components와 extensions가 있습니다. 현재 rustup은 components를 기본으로 설치합니다. extensions는 선택적 구성 요소이며, rustup component add 같은 명령으로 설치할 수 있습니다.

  • renames - 패키지 이름 변경 정보를 담고 있습니다. 사용자가 패키지의 별칭을 입력하면 이 정보를 사용하여 가져올 올바른 패키지를 결정할 수 있습니다.

    이름 변경은 보통 패키지가 미리 보기 단계를 벗어나 릴리스 품질에 이르렀다고 판단될 때 사용합니다. 예를 들어 rustfmt의 실제 패키지 이름은 rustfmt-preview입니다. 하지만 rustfmt가 릴리스된 이후로는 renames.rustfmt 테이블이 있으며, 이 테이블의 to 필드 값은 rustfmt-preview입니다. 사용자가 rustup component add rustfmt를 실행하면 이름이 자동으로 rustfmt-preview로 변환되고, rustup component list를 실행하면 사용자에게 보여 줄 때 rustfmt-preview가 다시 rustfmt로 자동 변환됩니다.

  • profiles - 이는 설치할 기본 구성 요소 집합을 결정하기 위한 향후 설정의 일부입니다. rustup은 pkg.rust의 components를 선택하는 대신 profiles 테이블의 항목 중 하나를 따르게 됩니다. 보통은 default 항목이 사용되며, 이 항목은 본질적으로(정확히 같지는 않지만) ["rustc", "cargo", "rust-std", "rust-docs", "rustfmt", "clippy"]에 해당합니다.

    그 밖의 프로필로는 minimal(["rustc", "cargo", "rust-std"])과, 표준 라이브러리 소스 사본(rust-src), miri, lldb, llvm-tools, rust-analysis 등을 추가로 포함하는 complete가 있습니다.

채널 매니페스트의 패키지 항목

앞서 설명한 것처럼, 패키지는 자신의 구성 요소와 확장(대부분 rust 패키지에만 해당합니다)을 나열하며, 타깃별 tarball 및 sha256 데이터를 제공할 수 있습니다.

예를 들어 패키지는 다음과 같을 수 있습니다.

[pkg.cargo.target.powerpc64-unknown-linux-gnu]
available = true
url = "https://static.rust-lang.org/dist/2019-05-23/cargo-0.36.0-powerpc64-unknown-linux-gnu.tar.gz"
hash = "279f3a84f40e3547a8532c64643f38068accb91c21f04cd16e46579c893f5a06"
xz_url = "https://static.rust-lang.org/dist/2019-05-23/cargo-0.36.0-powerpc64-unknown-linux-gnu.tar.xz"
xz_hash = "cf93b387508f4aea4e64f8b4887d70cc07a00906b981dc0c143e92e918682e4a"

여기서 이 항목이 cargo 패키지의 powerpc64-unknown-linux-gnu 타깃용임을 알 수 있습니다. url/hash 조합은 .tar.gz용이고, xz_url/xz_hash 쌍은 같은 tarball을 xz로 압축한 파일용입니다. url과 hash 쌍은 둘 중 하나만 있을 수도 있고 둘 다 있을 수도 있지만, 둘 다 없는 것은 available이 false로 설정되어 해당 패키지와 타깃 조합을 현재 이 채널에서 사용할 수 없음을 나타내는 경우가 아니라면 의미가 없습니다.

또한 패키지의 버전을 제공하는 단일 항목이 다음 형식으로 존재합니다.

[pkg.cargo]
version = "0.36.0 (6f3e9c367 2019-04-04)"

여기서 version은 사실상 $tool --version 출력에서 도구 이름을 뺀 값입니다.

타깃

타깃은 cargo build --target=$target으로 무언가를 빌드할 때 사용하는 것과 같은 트리플이며, rustup target add $target을 사용해 설치 환경에 추가할 수 있습니다. 이렇게 하면 rustup은 실제로 해당 타깃용 rust-std 패키지를 찾아 설치합니다. 본질적으로 가상의 명령인 rustup component add rust-std.$target과 같습니다.

어떤 타깃의 rust-std 패키지가 available = true가 아니면 해당 타깃은 rustup으로 설치할 수 없습니다. 이런 일은 하위 티어 타깃에서 가끔 발생합니다.

pkg 테이블에서 구성 요소와 확장은 타깃별로 지정되므로, 모든 타깃의 rust-std가 모든 rust 타깃의 확장에 지정되어 있는 것을 확인할 수 있습니다. 따라서 어떤 빌드 시스템에서든 원하는 rust-std를 설치해 크로스 컴파일을 할 수 있습니다.