빌드 머신의 운영체제와 아키텍처에서 실행되는 플랫폼 실행 파일 하나가 필요할 때 Rust 경로를 고릅니다. Rust는 빌드 대상일 뿐입니다. Rust 토큰이 토파즈 문법이 되지는 않습니다.
준비 사항
- 첫 애플리케이션의
study-plan패키지를 완성합니다. topaz.toml,topaz.lock,src/plan.tpz,src/main.tpz와 선택 테스트를 한곳에 둡니다.- 빌드 머신에 호환되는 Rust 도구 모음과 Cargo를 설치합니다.
- 다음 명령은
study-plan디렉터리에서 실행합니다.
완성된 실행 파일에는 토파즈와 Cargo, .tpz 파일이 필요하지 않습니다.
다만 빌드한 운영체제와 아키텍처에 맞춰 만들어진 파일입니다.
공유하는 검사 대상 패키지
Python 페이지도 같은 두 토파즈 모듈을 사용합니다. 먼저
src/plan.tpz입니다.
export record StudyTask {
title: string,
minutes: int,
done: bool = false,
}
function parseMinutes(text: string) -> Result<int, string> {
match toInt(text) {
case Some(value) if value > 0 => Ok(value)
case _ => Err("minutes must be a positive integer")
}
}
export function makeTask(
title: string,
minuteText: string,
done: bool = false,
) -> Result<StudyTask, string> {
let minutes = parseMinutes(minuteText)?
Ok(StudyTask { title: title, minutes: minutes, done: done })
}
export function summarize(tasks: Array<StudyTask>) -> string {
let mut remaining = 0
for task in tasks {
if !task.done {
remaining = remaining + task.minutes
}
}
"tasks={tasks.length}, remaining={remaining} minutes"
}패키지 진입점 src/main.tpz입니다.
import src.plan { StudyTask, makeTask, summarize }
export function main(args: Array<string>, stdin: string) -> Result<int, string> {
let tasks: Array<StudyTask> = [
makeTask("Run first program", "10", true)?,
makeTask("Build application", "25", false)?,
]
print(summarize(tasks))
Ok(0)
}토파즈 소스 검증하기
먼저 패키지를 검사합니다. 이어서 선택 테스트를 실행합니다. 마지막으로 기준 출력을 확인합니다.
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked
테스트는 tests/plan.tpz: test-ok를 보고합니다. 실행 결과는 다음과
같습니다.
tasks=2, remaining=25 minutes검토에는 emit, 배포에는 build
생성된 Cargo 소스 묶음을 직접 읽어 보거나 다른 코드에 통합해야 할 때만
emit을 사용합니다.
topaz emit --target rust --root . --locked --out-dir ../dist/rust-source
관리형 플랫폼 실행 제품은 build로 만듭니다.
topaz build --target native --root . --locked --out-dir ../dist/native
build --target rust는 올바른 명령이 아닙니다. rust는 emit에 쓰는
대상입니다. build로 만드는 배포 대상은 native입니다.
관리형 제품 확인하기
기본 디버그 빌드에는 다음 파일이 있습니다.
dist/native/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── target
│ └── debug
│ └── program[.exe]
└── topaz-artifact.jsontopaz-artifact.json에는 native 대상, 실행에 필요한 OS와 아키텍처
조건, 실행 명령, 모든 관리 파일의 크기와 SHA-256이 기록됩니다. 토파즈는
산출물 명세를 맨 마지막에 씁니다. 관리 파일이 바뀐 경우, 안전하지 않은
충돌이 생긴 경우, 같은 출력 디렉터리에 다른 대상이 있는 경우에는
거부합니다.
토파즈 소스를 사용할 수 없는 곳에서 실행하기
dist는 패키지 바깥에 있습니다. 원본 패키지를 다른 이름으로 옮긴 다음
제품만 실행합니다.
cd ..
mv study-plan source-unavailable
./dist/native/target/debug/program
Windows에서는 Rename-Item study-plan source-unavailable을 먼저
실행합니다. 그다음 .\dist\native\target\debug\program.exe를 실행합니다.
제품은 위와 같은 결과를 출력합니다. 종료 코드는 0입니다.
대상별 복구
- Cargo 도구 모음이 없거나 호환되지 않을 때는 빌드 머신을 먼저 고칩니다. 그다음 다시 빌드합니다.
--release는target/release/program[.exe]를 만듭니다. 바뀌는 것은 빌드 프로필뿐입니다.- 기본 코드 생성은 값을 감싸는 공통 Rust 실행 환경을 사용합니다. 선택 옵션인
--backend native는 입증된 영역만 특수화합니다. 지원하지 않는 형식은 추측하지 않고 공통 값 표현 그대로 둡니다. - 플랫폼 실행 파일을 다른 OS나 아키텍처에 복사해 놓고 지원되는 배포라고 부르면 안 됩니다.
정확한 경계
생성된 Rust 코드와 실행 환경 묶음은 언제든 교체할 수 있는 산출물입니다. 손으로 확장해 쓰는 API나 소스 수준 Rust FFI가 아닙니다. 실행에 성공했다면 이 대상에서 이 프로그램이 낸 출력과 종료 코드에 관한 증거를 얻은 것입니다. 사용자가 작성한 래퍼는 별도의 호스트 코드 계약에 따라 검토합니다.
상호 운용 개요, Python 백엔드, 인터프리터와 백엔드, 산출물과 배포로 이어서 살펴보세요.