Распространение
deno desktop доступен начиная с Deno v2.9.0. Если у вас более ранняя версия, обновите Deno, чтобы использовать его.
deno desktop выполняет кросс-компиляцию на любой хостовой системе. На одной и той же машине можно собрать приложение для macOS Intel, macOS arm64, Windows x86_64, Linux arm64 и Linux x86_64. Бинарные файлы бэкенда (CEF, WebView и т. д.) загружаются по мере необходимости.
Выходные файлы для каждой платформы
# Build for the host platform.
deno desktop main.ts
# Build for a specific target.
deno desktop --target aarch64-apple-darwin main.ts
# Build for every supported target in one go.
deno desktop --all-targets main.ts
Поддерживаемые целевые платформы:
| Целевая платформа | ОС | Архитектура |
|---|---|---|
aarch64-apple-darwin | macOS | arm64 |
x86_64-apple-darwin | macOS | Intel |
x86_64-pc-windows-msvc | Windows | x86_64 |
aarch64-unknown-linux-gnu | Linux | arm64 |
x86_64-unknown-linux-gnu | Linux | x86_64 |
CLI автоматически загружает подходящий предварительно собранный denort и соответствующий архив бэкенда. На хостовой системе не требуется инструментальная цепочка для конкретной платформы.
Форматы выходных файлов
Формат определяется расширением выходного файла:
macOS
| Выходной файл | Создаётся командой |
|---|---|
MyApp.app/ | По умолчанию; пакет .app. |
MyApp.dmg |
hdiutil; образ диска, который можно перетащить в папку «Программы». |
Пакет .app имеет стандартную структуру:
MyApp.app/
Contents/
Info.plist
MacOS/
MyApp # the launcher
Resources/
icon.icns
Frameworks/
Chromium Embedded Framework.framework/ # CEF backend
…
По умолчанию включён режим самораспаковки: при первом запуске встроенная виртуальная файловая система (ваш код, результаты сборки фреймворка и статические ресурсы) распаковывается на диск, чтобы такие фреймворки, как Next.js, могли находить результаты сборки относительно CWD.
Windows
| Выходной файл | Создаётся командой |
|---|---|
MyApp/ | По умолчанию; каталог с программой запуска и вспомогательными файлами. |
MyApp.msi | Пакет установщика Windows (установка для всех пользователей компьютера). |
Каталог MyApp/ содержит:
MyApp/
MyApp.bat # launcher
denort.dll # Deno runtime + your code
*.dll # rendering backend and CEF libraries
resources.pak, locales/ # CEF support files
AppIcon.ico # icon (optional)
Укажите расширение выходного файла .msi, чтобы собрать пакет установщика Windows напрямую. Он устанавливает приложение для всех пользователей компьютера в %ProgramFiles%\<AppName>\ и регистрирует программу удаления. MSI создаётся на чистом Rust, поэтому его можно кросс-компилировать на любом хосте (целевой системой должна быть Windows). Чтобы упаковать каталог другим способом, создайте ZIP-архив или передайте его стороннему генератору установщиков, например Inno Setup, NSIS или WiX.
Linux
| Выходной файл | Создаётся командой |
|---|---|
my-app/ | По умолчанию; каталог приложения со скриптом запуска. |
my-app.AppImage | Портативный пакет в одном файле. |
my-app.deb | Пакет для Debian/Ubuntu. |
my-app.rpm | Пакет для Fedora/RHEL. |
Структура каталога приложения:
my-app/
my-app # launcher shell script
libdenort.so # Deno runtime + your code
*.so # rendering backend and CEF libraries
resources.pak, locales/ # CEF support files
AppIcon.png # icon (optional)
AppImage — самый портативный формат для Linux: один файл, установка не требуется, работает в любом современном дистрибутиве. deno desktop собирает его напрямую: упаковывает каталог приложения в образ SquashFS и добавляет в начало среду выполнения AppImage Type-2, а также необходимые записи AppRun, .desktop и значка. Внешние инструменты устанавливать не нужно (например, appimagetool); пакет можно собрать на любом хосте, поэтому Linux .AppImage можно создать при кросс-компиляции из macOS или Windows.
Укажите расширение выходного файла .deb или .rpm, чтобы напрямую собрать пакет для Linux. Оба формата устанавливают приложение в /usr/lib/<pkg>/, создают символическую ссылку на программу запуска в /usr/bin/ и регистрируют запись .desktop и значок. Как и .AppImage, они собираются на чистом Rust и поддерживают кросс-компиляцию на любом хосте (целевой системой должна быть Linux).
Сжатие пакета
Передайте --compress, чтобы создать самораспаковывающийся пакет. Объёмные данные (среда выполнения и бэкенд интерфейса) сжимаются внутри распространяемого приложения и при первом запуске распаковываются в каталог данных пользователя, а при последующих запусках используются повторно. Это значительно уменьшает размер распространяемого файла: например, веб-приложение hello-world с WebView уменьшается примерно с 66 МБ до 19 МБ. Компромисс — однократная распаковка при первом запуске.
# Self-extracting, compressed bundle
deno desktop --compress main.ts
# Choose the codec explicitly
deno desktop --compress=xz main.ts
deno desktop --compress=zstd main.ts
xz создаёт файл меньшего размера; zstd занимает больше места, но быстрее распаковывается при первом запуске.
Выбор пути выходного файла
Путь выходного файла можно указать в трёх местах, в порядке убывания приоритета:
- Флаг CLI
--output. - Поле
desktop.outputвdeno.json(для каждой платформы отдельно). - Значение по умолчанию: имя проекта с расширением, соответствующим платформе.
# Override per build:
deno desktop --output ./builds/MyApp-1.4.0.dmg main.ts
{
"desktop": {
"output": {
"macos": "./dist/macos/MyApp.app",
"windows": "./dist/windows/MyApp",
"linux": "./dist/linux/my-app.AppImage"
}
}
}
Подробности кросс-компиляции
Для кросс-компиляции с одной ОС на другую необходимы:
- Подходящий бинарный файл
denortдля целевой платформы. Автоматически загружается сgithub.com/denoland/deno/releasesв соответствии с локальной версией Deno. - Подходящий архив бэкенда для целевой платформы. Загружается автоматически; его версия соответствует версии Deno.
Контрольные суммы SHA-256 обоих загружаемых файлов проверяются, а файлы кэшируются в <deno_dir>/.
deno desktop также принимает --engine v8|quickjs, который выбирает движок JavaScript внутри загруженной библиотеки среды выполнения. По умолчанию используется V8; экспериментальная сборка QuickJS меньше по размеру, но не получает тех же обновлений безопасности. Подробнее о компромиссах см. в разделе выбор движка JavaScript.
Для кросс-компиляции настольного приложения инструментальная цепочка Rust не требуется. Вы не компилируете Rust на хосте: вместо этого загружаете предварительно собранные артефакты для целевой платформы и упаковываете их вместе со своим кодом. Эта модель аналогична deno compile --target.
Сборка значков (.icns, .ico) и Linux .AppImage выполняется на любом хосте. Единственное исключение — macOS .dmg, для которого вызывается hdiutil, поэтому его необходимо собирать на хосте с macOS. Чтобы создать .dmg на другой платформе, соберите его на машине macOS CI.
CI
Типичная матрица GitHub Actions параллельно собирает установщики для соответствующих платформ:
jobs:
build:
strategy:
matrix:
include:
- { os: macos-14, target: aarch64-apple-darwin }
- { os: macos-15-intel, target: x86_64-apple-darwin }
- { os: windows-latest, target: x86_64-pc-windows-msvc }
- { os: ubuntu-latest, target: x86_64-unknown-linux-gnu }
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
- run: deno desktop --target ${{ matrix.target }} main.ts
- uses: actions/upload-artifact@v4
with:
name: my-app-${{ matrix.target }}
path: dist/
Кросс-компиляция на одном хосте (например, только на ubuntu-latest с помощью --all-targets) работает для пакетов и Linux .AppImage. Только для macOS .dmg требуется хост с macOS.
Подписание кода
В macOS deno desktop самостоятельно подписывает пакет. По умолчанию применяется специальная (ad-hoc) подпись (-), которая присваивает приложению постоянный идентификатор кода, достаточный для предоставления ОС разрешения на уведомления, но недостаточный для распространения без предупреждений Gatekeeper. Идентификаторы пакетов вспомогательных процессов CEF автоматически согласуются с идентификатором основного пакета.
Чтобы создать пакет, готовый к распространению и нотариальному заверению, укажите настоящую идентификацию подписи в deno.json (подписание должно выполняться на хосте с macOS, поскольку для него вызывается codesign(1)):
{
"desktop": {
"app": { "identifier": "com.example.myapp" },
"macos": {
"codesignIdentity": "Developer ID Application: Acme, Inc. (TEAMID)"
}
}
}
При использовании настоящей идентификации пакет подписывается с включённой Hardened Runtime и защищённой временной меткой. Нотариальное заверение по-прежнему выполняется отдельно. Отправьте подписанный пакет с помощью xcrun notarytool submit и прикрепите билет.
В Windows подпишите созданные исполняемые файлы (бэкенд .exe и denort.dll в выходном каталоге) с помощью внешнего инструмента, например signtool sign /f cert.pfx /tr <timestamp> <file>.
Распространение обновлений после выпуска
После того как бинарный файл попадёт к пользователям, распространяйте обновления с помощью Deno.autoUpdate(): bsdiff — обновления, доставляемые с вашего собственного сервера, без необходимости размещения в магазине приложений.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/distribution