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 파일이 함께 제공되며, 이는 다운로드한 데이터의 무결성을 확인하는 데 사용할 수 있습니다. 이에 더해 각 채널의 매니페스트에는 분리된 GPG 서명인 .asc 파일도 함께 제공되어, 채널 매니페스트의 무결성뿐 아니라 진위 여부까지 확인할 수 있습니다.

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 파일의 최상위 계층은 두 개의 중요한 키/값 쌍으로 구성됩니다. 첫째로 현재 "2"manifest-version, 둘째로 값이 "YYYY-MM-DD" 형식인 매니페스트의 날짜(date)입니다.

그다음에는 여러 최상위 절(테이블)들이 있으며, 다음과 같습니다:

  • pkg - 이는 매니페스트의 대부분을 차지하며 릴리스에 포함된 패키지들을 나열합니다. 일반적으로 이는 rust, rustc, cargo 등과 같은 것들입니다. rust 패키지는 다소 특수하며, 현재는 기본적으로 설치될 다른 패키지들의 부분집합을 지정하는 데 사용됩니다.

    패키지 안에는 componentsextensions가 있습니다. 현재 componentsrustup에 의해 기본적으로 설치되며, extensions는 선택적 구성 요소로서 rustup component add 등을 통해 사용할 수 있습니다.

  • renames - 이는 사용자가 별칭을 입력했을 때 가져올 올바른 패키지를 결정하는 데 사용할 수 있는 패키지 이름 변경 집합을 담고 있습니다.

    일반적으로 이름 변경은 패키지가 미리보기 상태를 벗어나 릴리스 품질로 간주될 때 사용됩니다. 예를 들어, rustfmt의 실제 패키지 이름은 rustfmt-preview이지만, 그 릴리스 이후로 to 필드가 rustfmt-previewrenames.rustfmt 테이블이 존재해 왔습니다. 사용자가 rustup component add rustfmt를 실행하면 그 이름은 자동으로 rustfmt-preview로 변환되며, 사용자가 rustup component list를 실행하면 rustfmt-preview는 사용자에게 표시될 때 자동으로 다시 rustfmt로 변환됩니다.

  • profiles - 이것은 설치할 기본 컴포넌트 집합을 결정하기 위한 향후 설정의 일부입니다. pkg.rustcomponents를 선택하는 대신, rustupprofiles 테이블에 있는 항목 중 하나를 따르게 됩니다. 보통 이는 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 쌍 중 어느 한쪽만 있을 수도 있고, 둘 다 있을 수도 있지만, availablefalse로 설정되어 해당 채널에서 현재 그 패키지와 타겟 조합을 사용할 수 없음을 나타내는 경우가 아니라면 둘 다 없는 것은 의미가 없습니다.

또한, 다음과 같은 형태로 패키지의 버전을 제공하는 단일 항목이 있게 됩니다:

[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 타겟의 확장에 모든 타겟에 대한 rust-std가 명시되어 있음을 확인할 수 있습니다. 이를 통해 어떤 빌드 시스템에서든 임의의 rust-std를 설치함으로써 크로스 컴파일이 가능해집니다.