Spec-Zone.ru › Deno 2

Распространение

Доступно в Deno 2.9

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 занимает больше места, но быстрее распаковывается при первом запуске.

Выбор пути выходного файла

Путь выходного файла можно указать в трёх местах, в порядке убывания приоритета:

  1. Флаг CLI --output.
  2. Поле desktop.output в deno.json (для каждой платформы отдельно).
  3. Значение по умолчанию: имя проекта с расширением, соответствующим платформе.
›_
# Override per build:
deno desktop --output ./builds/MyApp-1.4.0.dmg main.ts
deno.json
{
  "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 параллельно собирает установщики для соответствующих платформ:

.github/workflows/release.yml
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)):

deno.json
{
  "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 — обновления, доставляемые с вашего собственного сервера, без необходимости размещения в магазине приложений.

Последнее обновление: 6 августа 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/distribution

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API