Переходите к этой странице после раздела Первое приложение. Этапы разработки являются общими, но способы поставки различаются. Выберите один необходимый целевой продукт вместо сборки всех вариантов подряд.
- Платформенный файл подходит для автономного исполняемого файла, которому при развёртывании не требуется среда выполнения Топаза.
- Python подходит, если в среде развёртывания уже установлен Python 3.11 или новее.
- Web Application подходит, если Топаз управляет моделью браузерного приложения, сообщениями, обновлением состояния и отображением.
- HTTP-сервис подходит для проверенного обработчика запросов, работающего под управлением супервизора и, для публичного трафика, за обратным прокси-сервером.
Raw Web и Worker предназначены для интеграции с существующей средой JavaScript. Они описаны в разделе WASM и песочница.
Общий цикл разработки
Начните с проверенного пакета из двух модулей. Манифест текущего платформенного
пакета имеет следующее содержимое. Сохраните его под именем topaz.toml:
[package]
name = "task_summary"
version = "0.1.0"
language = "5.19"
entry = "src/main.tpz"
[build]
target = "native"
deterministic = true
[dependencies]
std = "5.19"Вспомогательный модуль выполняет вычисления приложения:
export function оставшиесяМинуты(значения: Array<int>) -> int {
let mut итого = 0
for значение in значения {
итого += значение
}
итого
}Входной модуль преобразует результат в наблюдаемую команду:
import src.summary { оставшиесяМинуты }
export function main(аргументы: Array<string>, ввод: string) -> Result<int, string> {
let минуты = оставшиесяМинуты([10, 25])
print("remaining={минуты}")
Ok(0)
}Создайте topaz.lock один раз, затем выполняйте регулярную работу в следующем порядке:
topaz lock --root task-summary
topaz fmt --check --root task-summary
topaz check --root task-summary --locked
topaz test --root task-summary --locked
topaz run --root task-summary --lockedКоманда fmt --check сообщает о расхождениях в форматировании, не изменяя файлы.
При возникновении ошибок check и test останавливаются до формирования продукта. Исправьте первую
диагностику Топаза и повторите ту же команду. Подробные сведения о коде диагностики
можно получить с помощью команды topaz explain TPZ####.
Путь А: платформенное командное приложение или Python
Для платформенной сборки требуется инструментарий Rust, соответствующий текущей операционной системе и архитектуре. Для сборки под Python Rust не требуется, однако для готового продукта необходим Python 3.11 или новее.
Соберите только тот продукт, который планируете поставлять:
topaz build --release --root task-summary --locked --out-dir native-product
topaz build --target python --root task-summary --locked --out-dir python-productДеревья релизных продуктов выглядят следующим образом:
native-product/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── target
│ └── release
│ └── program[.exe]
└── topaz-artifact.json
python-product/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── program.py
├── topaz-artifact.json
└── topaz_py_rt.pyprogram[.exe] обозначает program в Unix и program.exe в Windows. Скопируйте
выбранный каталог целиком в новое место и запускайте из его корня:
./target/release/program
python3 program.pyПервая команда относится к платформенному продукту, вторая — к продукту
Python. Это взаимоисключающие варианты. Если приложение объявляет [capabilities.fs],
разместите рядом с продуктом его каталог data/ и директории, доступные для записи, а
корень продукта оставьте в качестве рабочего каталога. Данные приложения не включаются
автоматически ни в платформенный продукт, ни в продукт Python.
Если для сборки не хватает инструментария Rust, установите подходящую версию Rust либо выберите вариант с Python. Если каталог вывода уже содержит другую цель или изменённый управляемый файл, сохраните его для анализа и соберите продукт в новом пустом каталоге.
Путь Б: управляемое веб-приложение
Для сборки Web Application требуется Rust с установленной целевой платформой
wasm32-unknown-unknown. Не преобразуйте командный входной модуль, а создайте
проверенный каркас:
topaz init --target web-app --root hello-web
topaz lock --root hello-web
topaz fmt --check --root hello-web
topaz check --root hello-web --locked
topaz test hello-web/tests/app.tpz --root hello-web --locked
topaz dev --root hello-web --port 8000
topaz build --root hello-web --locked --release --out-dir web-productСозданный входной модуль использует проверяемый жизненный цикл:
import std.dom { Html, WebAppEvent, WebAppStep, text }
export record Модель {
сообщение: string,
}
export enum Сообщение {
Готово,
}
export function init() -> WebAppStep<Модель, Сообщение> {
WebAppStep { model: Модель { сообщение: "Hello from Topaz" }, commands: [] }
}
export function update(
модель: Модель,
сообщение: Сообщение,
событие: WebAppEvent,
) -> WebAppStep<Модель, Сообщение> {
WebAppStep { model: модель, commands: [] }
}
export function view(модель: Модель) -> Html<Сообщение> {
text(модель.сообщение)
}topaz dev — сервер разработки на локальном интерфейсе, который сохраняет
последний исправный продукт при возникновении ошибок в коде. Это не
промышленный сервер. Итоговый каталог содержит HTML, проверенную среду
приложения, обёртку Raw Web, WASM, метаданные полномочий, объявленные стили и
ресурсы, а также общие файлы лицензий и манифест артефакта. Скопируйте
каталог целиком на статический сервер и раздавайте его по HTTP. Открытие
модулей ES по протоколу file:// не является способом развёртывания.
Data Lens — поддерживаемый многомодульный пример этого пути.
Путь В: HTTP-сервис
Если продукт представляет собой обработчик запросов, а не команду или браузерный интерфейс, создайте каркас сервиса:
topaz init --target http-service --root hello-service
topaz lock --root hello-service
topaz fmt --check --root hello-service
topaz check --root hello-service --locked
topaz test --root hello-service --locked
topaz dev --root hello-service --port 8080
topaz build --root hello-service --locked --release --out-dir service-productГраница обработчика является конкретной и синхронной:
import std.http { HttpRequest, HttpResponse, text }
export function handle(запрос: HttpRequest) -> HttpResponse {
if запрос.url.path() == "/health" {
return text(200, "ok")
}
text(404, "not found")
}Продукт сервиса содержит один платформенный исполняемый файл, встроенные ограниченные настройки, уведомления сторонних компонентов и общие файлы артефакта. По умолчанию он принимает соединения на локальном интерфейсе. Для использования другого адреса требуется передать явный аргумент процесса. Данный вариант не добавляет TLS, HTTP/2, исходящие сетевые запросы или универсальный веб-фреймворк.
Раздел HTTP-сервис завершает этот путь. В нём описаны бюджеты ресурсов, наблюдаемые ошибки, запуск без исходных текстов и восстановление после проблем развёртывания.