배포 환경에 Python 3.11 이상이 있고 읽을 수 있는 생성 제품이 유용하다면 Python 경로를 고릅니다. Python은 빌드 대상이며 Python 문법이 토파즈 문법이 되는 것은 아닙니다.
준비 사항
- 첫 애플리케이션의
study-plan패키지를 완성합니다. topaz.toml,topaz.lock,src/plan.tpz,src/main.tpz, 선택 테스트를 함께 둡니다.- 배포할 컴퓨터에 Python 3.11 이상을 설치합니다.
- 다음 명령은
study-plan디렉터리에서 실행합니다.
제품을 실행할 때 토파즈 컴파일러와 .tpz 파일은 필요하지 않습니다.
다만 생성된 Python 소스와 지원 모듈을 포함하므로 네이티브 실행 파일은
아닙니다.
공유하는 검사 대상 패키지
Rust 페이지도 같은 두 토파즈 모듈을 사용합니다. 먼저
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
생성 Python 소스를 살펴보거나 통합해야 할 때만 emit을 사용합니다.
topaz emit --target python --root . --locked --out-dir ../dist/python-source
완전한 관리형 Python 제품은 build로 만듭니다.
topaz build --target python --root . --locked --out-dir ../dist/python
빌드한 뒤에는 program.py를 직접 실행합니다. Python 빌드는 --run과
--release를 거부하며, 둘 다 Python 제품용 옵션이 아닙니다. Rust용
--backend 옵션도 Python 빌드에서 사용할 수 없습니다.
관리형 제품 확인하기
제품에는 다음 파일이 있습니다.
dist/python/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── program.py
├── topaz-artifact.json
└── topaz_py_rt.pytopaz-artifact.json에는 python 대상, Python 3.11 이상 실행 요구 사항,
실행 명령, 모든 관리 파일의 크기와 SHA-256이 기록됩니다. 토파즈는
manifest를 마지막에 쓰며, 변경된 관리 파일, 안전하지 않은 충돌, 같은
출력 디렉터리의 다른 대상을 거부합니다. 전체 트리를 배포하세요.
program.py와 topaz_py_rt.py는 함께 있어야 하며 고지, 라이선스,
manifest도 관리형 제품의 일부입니다.
토파즈 소스를 사용할 수 없는 곳에서 실행하기
dist가 패키지 밖에 있으므로 원본 패키지를 옮긴 뒤 제품만 실행합니다.
cd ..
mv study-plan source-unavailable
python3 dist/python/program.py
Windows에서는 Rename-Item study-plan source-unavailable을 사용한 뒤
python dist\python\program.py를 실행합니다. 제품은 종료 코드 0으로
끝나고 위와 같은 결과를 출력합니다.
대상별 복구
Python 백엔드는 지원하지 않는 표준 라이브러리 연산을 산출물 작성 전에
소스 위치와 함께 보고합니다. 이 대상에서는
Codec.deflateFixedCompress, Codec.zlibFixedCompress,
Codec.reedSolomon255223Protect를 사용할 수 없습니다. 해당 연산을
지원하는 대상으로 유지하거나 다른 구현을 선택한 뒤 다시 빌드하세요.
program.py가 topaz_py_rt.py를 불러오지 못하면 생성 파일 하나만
복사하지 말고 관리형 트리 전체를 복원합니다. Python 버전이 낮다면
배포 환경에 Python 3.11 이상을 설치합니다.
정확한 경계
생성 Python은 교체 가능한 배포 산출물이며, 손으로 확장하는 안정 API나
네이티브 실행 파일이 아닙니다. 성공한 실행은 선택한 Python 환경에서
이 프로그램의 출력과 종료 코드만 확인합니다. 임의의 Python 라이브러리,
예외, 데코레이터, 패키지 API를 .tpz 소스에 열어 주지는 않습니다.
상호 운용 개요, Rust 백엔드, 인터프리터와 백엔드, 산출물과 배포로 이어서 살펴보세요.