Spec-Zone.ru › Deno 2

Управление зависимостями

Deno — это полноценный менеджер пакетов для пакетов npm и JSR, встроенный в двоичный файл deno. Он работает с deno.json, package.json или с обоими одновременно и безопасен по умолчанию: сценарии жизненного цикла npm не запускаются, пока вы не разрешите их выполнение. На этой странице описан повседневный рабочий процесс; в таблице команд перечислены все команды.

Быстрый старт

В проекте, в котором уже объявлены зависимости (в package.json или deno.json), установите их командой:

›_
deno install

Добавьте новую зависимость из npm или JSR. Имена без префикса обозначают пакеты npm, например npm install:

›_
deno install express            # any npm package
deno install jsr:@std/assert    # a JSR package

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

import express from "express";
import { assertEquals } from "@std/assert";

Набор команд для работы с зависимостями

Для каждой задачи, связанной с зависимостями, предусмотрена встроенная подкоманда. По ссылкам можно перейти к полному описанию каждой команды:

Команда Назначение
deno install Установить зависимости проекта (или инструмент с помощью -g)
deno add Добавить зависимость в файл конфигурации
deno remove Удалить зависимость из файла конфигурации
deno outdated Вывести список зависимостей, для которых доступны более новые версии
deno update Обновить зависимости до более новых версий
deno why Объяснить, почему пакет входит в дерево зависимостей
deno info Показать полный граф зависимостей модуля и сведения о кэше
deno audit Проверить установленные зависимости на наличие известных уязвимостей
deno approve-scripts Разрешить выполнение сценариев жизненного цикла npm для определённых пакетов
deno ci Чистая установка со строгой проверкой lock-файла для CI (как npm ci)
deno publish Опубликовать пакет в JSR
deno pack Создать совместимый с npm tarball из пакета Deno
deno uninstall Удалить глобально установленный инструмент
deno clean Удалить глобальный кэш модулей

Выбор версий

Можно задать диапазон версий импортируемого пакета. Для этого используется символ @, за которым следует спецификатор диапазона версий, соответствующий схеме версионирования semver. Если нужно использовать один диапазон версий в нескольких участниках рабочей области, см. раздел catalog: о централизованном управлении версиями зависимостей.

Например:

›_
@scopename/mypackage           # highest version
@scopename/mypackage@16.1.0    # exact version
@scopename/mypackage@16        # highest 16.x version >= 16.0.0
@scopename/mypackage@^16.1.0   # highest 16.x version >= 16.1.0
@scopename/mypackage@~16.1.0   # highest 16.1.x version >= 16.1.0

Ниже перечислены все способы указать версию или диапазон версий:

Символ Описание Пример
1.2.3 Точная версия. Будет использоваться только эта конкретная версия. 1.2.3
^1.2.3 Совместима с версией 1.2.3. Допускаются обновления, не меняющие крайнюю левую ненулевую цифру.
Например, допустимы 1.2.4 и 1.3.0, но не 2.0.0.
^1.2.3
~1.2.3 Приблизительно эквивалентна версии 1.2.3. Допускаются обновления версии исправления.
Например, допустима 1.2.4, но не 1.3.0.
~1.2.3
>=1.2.3 Версия 1.2.3 или выше. Допускается любая версия 1.2.3 или выше. >=1.2.3
<=1.2.3 Версия 1.2.3 или ниже. Допускается любая версия 1.2.3 или ниже. <=1.2.3
>1.2.3 Версия выше 1.2.3. Допускаются только версии выше 1.2.3. >1.2.3
<1.2.3 Версия ниже 1.2.3. Допускаются только версии ниже 1.2.3. <1.2.3
1.2.x Любая версия исправления в рамках младшей версии 1.2. Например, 1.2.0, 1.2.1 и т. д. 1.2.x
1.x Любая младшая версия и версия исправления в рамках основной версии 1. Например, 1.0.0, 1.1.0, 1.2.0 и т. д. 1.x
* Допускается любая версия. *

Просмотр и обновление зависимостей

Узнайте, для каких зависимостей доступны более новые версии, а затем обновите их:

›_
deno outdated      # display what's behind, without changing anything
deno update        # update to the latest semver-compatible versions
deno update --latest   # ignore semver ranges and go to the newest releases

Чтобы узнать, откуда взялся пакет, команда deno why выведет все пути зависимостей, ведущие к нему:

›_
deno why npm:kleur

Команда deno info показывает полный граф зависимостей модуля, в том числе размеры и расположение кэша, для точки входа или любого спецификатора:

›_
deno info main.ts
deno info jsr:@std/http

Проверка на наличие уязвимостей

Команда deno audit проверяет установленные зависимости по базам данных уязвимостей:

›_
deno audit                 # report known vulnerabilities
deno audit --level=high    # only high and critical severity
deno audit --fix           # upgrade affected packages automatically
deno audit --socket        # check against the socket.dev database

Аудит — одна из мер, которая помогает со временем поддерживать безопасность дерева зависимостей. О других практиках см. раздел Управление цепочкой поставок: минимальный возраст зависимостей, работа с lock-файлом и рекомендуемая базовая настройка CI.

Сценарии жизненного цикла

В отличие от npm, Deno по умолчанию не запускает сценарии preinstall/postinstall: сценарии установки пакета представляют собой распространённый вектор атак, поэтому их выполнение нужно разрешать отдельно. Если зависимость действительно нуждается в таких сценариях (например, для нативных дополнений), разрешите их явно:

›_
deno install --allow-scripts=npm:better-sqlite3

Также можно управлять разрешениями в интерактивном режиме с помощью команды deno approve-scripts. Сценарии выполняются только при использовании каталога node_modules.

Lock-файл и воспроизводимые установки

Deno автоматически поддерживает файл deno.lock, в котором записаны точная версия и хеш целостности каждой зависимости, и проверяет его при последующих запусках. Добавьте его в систему контроля версий. В CI и production выполняйте строгую установку из lock-файла с помощью команды deno ci. Она завершится с ошибкой, если deno.lock отсутствует или устарел, вместо того чтобы молча разрешать новые версии:

›_
deno ci          # like npm ci
deno ci --prod   # additionally skip devDependencies

Также можно принудительно использовать неизменяемый lock-файл в любой команде с помощью --frozen или настроить поведение и путь к lock-файлу в deno.json. О важности lock-файла и способах решения проблем с ним см. раздел Управление цепочкой поставок.

node_modules и кэш

По умолчанию Deno хранит зависимости в глобальном кэше и создаёт локальный каталог node_modules, только если в проекте есть package.json. Настройте это с помощью параметра nodeModulesDir в deno.json.

По умолчанию Deno использует глобальный каталог кэша (DENO_DIR) для загруженных зависимостей. Этот кэш общий для всех проектов.

Чтобы заставить deno повторно загрузить и скомпилировать модули в кэш, используйте флаг --reload.

›_
# Reload everything
deno run --reload my_module.ts

# Reload a specific module
deno run --reload=jsr:@std/fs my_module.ts

Действует и обратное: --cached-only полностью запрещает доступ к сети и завершает работу с ошибкой, если чего-либо из дерева зависимостей ещё нет в кэше. Это удобно для работы без подключения к сети и воспроизводимых сборок CI:

deno run --cached-only mod.ts

Локальное хранение удалённых модулей

Если в проекте есть внешние зависимости, их можно хранить локально, чтобы не загружать из интернета при каждой сборке проекта. Это особенно полезно при сборке проекта на сервере CI или в контейнере Docker, а также при исправлении или изменении удалённых зависимостей.

Deno предоставляет эту возможность с помощью настройки в файле deno.json:

{
  "vendor": true
}

Добавьте приведённый выше фрагмент в файл deno.json, и при запуске проекта Deno будет кэшировать все зависимости локально в каталоге vendor. Также можно сразу кэшировать зависимости с помощью команды deno install --entrypoint:

›_
deno install --entrypoint main.ts

Затем запустите приложение как обычно с помощью deno run:

›_
deno run main.ts

После сохранения зависимостей локально можно запускать main.ts без доступа к интернету, используя флаг --cached-only, который заставляет Deno использовать только доступные локально модули.

Дополнительные способы переопределения, например подмена зависимостей во время разработки, описаны в разделе Переопределение зависимостей.

Переопределение зависимостей

Deno предоставляет механизмы переопределения зависимостей, позволяющие разработчикам использовать собственные или локальные версии библиотек во время разработки и тестирования.

Примечание. Если нужно кэшировать и изменять зависимости локально для использования в разных сборках, рассмотрите возможность локального хранения удалённых модулей.

Переопределение локальных пакетов

Для разработчиков, знакомых с npm link в Node.js, в Deno предусмотрена аналогичная возможность для локальных пакетов JSR и npm. Она настраивается с помощью поля links в deno.json. Это позволяет переопределять зависимости локальными версиями во время разработки, не публикуя их.

Пример:

deno.json
{
  "links": [
    "../some-package-or-workspace"
  ]
}

Основные моменты:

  • Поле links принимает пути к каталогам с пакетами или рабочими областями. Если указать отдельный пакет в рабочей области, будет включена вся рабочая область.
  • Поддерживаются пакеты JSR и npm.
  • Эта возможность учитывается только в корне рабочей области. Использование links в другом месте приведёт к появлению предупреждений.

Ограничения:

  • Переопределение зависимостей на основе Git недоступно.
  • Поле links необходимо правильно настроить в корне рабочей области.

Переопределение пакетов npm

Deno поддерживает связывание пакетов npm с локальными версиями, подобно связыванию пакетов JSR. Это позволяет использовать локальную копию пакета npm во время разработки, не публикуя её.

Чтобы использовать локальный пакет npm, настройте поле links в файле deno.json:

{
  "links": [
    "../path/to/local_npm_package"
  ]
}

Для этой возможности требуется каталог node_modules; её поведение зависит от настройки nodeModulesDir:

  • При использовании "nodeModulesDir": "auto" каталог создаётся заново при каждом запуске. Это немного увеличивает время запуска, но гарантирует, что всегда будет использоваться последняя версия.
  • При использовании "nodeModulesDir": "manual" (по умолчанию при работе с package.json) после обновления пакета нужно выполнить deno install, чтобы изменения попали в каталог node_modules рабочей области.

Ограничения:

  • Указание локальной копии пакета npm или изменение его зависимостей приведёт к удалению пакетов npm из lock-файла, что может изменить разрешение зависимостей npm.
  • Имя пакета npm должно существовать в реестре, даже если используется локальная копия.

Переопределение HTTPS-импортов

Deno также позволяет переопределять HTTPS-импорты с помощью поля scopes в deno.json. Эта возможность особенно полезна, когда для отладки или временного исправления нужно заменить удалённую зависимость локальной версией с изменениями.

Пример:

deno.json
{
  "imports": {
    "example/": "https://deno.land/x/example/"
  },
  "scopes": {
    "https://deno.land/x/example/": {
      "https://deno.land/x/my-library@1.0.0/mod.ts": "./patched/mod.ts"
    }
  }
}

Основные моменты:

  • Поле scopes в карте импортов позволяет перенаправлять отдельные импорты на альтернативные пути.
  • Обычно это используется для замены удалённых зависимостей локальными файлами при тестировании или разработке.
  • Области действия применяются только к корню проекта. Вложенные области действия в зависимостях игнорируются.

Зависимости только для разработки

Иногда зависимости нужны только во время разработки, например зависимости тестовых файлов или инструменты сборки. В Deno среде выполнения не нужно разделять зависимости для разработки и production: среда выполнения загружает и устанавливает только те зависимости, которые действительно используются в исполняемом коде.

Однако пометка зависимостей для разработки может быть полезна читателям вашего пакета. При использовании deno.json принято добавлять комментарий // dev после каждой зависимости, используемой «только для разработки»:

deno.json
{
  "imports": {
    "@std/fs": "jsr:@std/fs@1",
    "@std/testing": "jsr:@std/testing@1" // dev
  }
}

При использовании файла package.json зависимости для разработки можно добавить в отдельное поле devDependencies:

package.json
{
  "dependencies": {
    "pg": "npm:pg@^8.0.0"
  },
  "devDependencies": {
    "prettier": "^3"
  }
}

Если вы в основном работаете с package.json, задайте "preferPackageJson": true в deno.json, чтобы команды deno add, deno install и deno remove по умолчанию записывали данные туда, а не в deno.json, без необходимости каждый раз передавать --package-json. См. preferPackageJson.

Пакеты JSR в package.json

Можно напрямую добавлять зависимости JSR в package.json с помощью схемы jsr: без отдельного файла deno.json:

package.json
{
  "dependencies": {
    "@std/path": "jsr:^1.0.9"
  }
}

Это работает с deno install и позволяет добавлять пакеты JSR в любой проект, использующий package.json для управления зависимостями.

Переопределение зависимостей

Поле overrides в package.json позволяет управлять версиями транзитивных зависимостей во всём дереве зависимостей. Это удобно для установки исправлений безопасности, устранения проблем совместимости версий или замены пакетов:

package.json
{
  "dependencies": {
    "express": "^4.18.0"
  },
  "overrides": {
    "cookie": "0.7.0",
    "express": {
      "qs": "6.13.0"
    }
  }
}

В этом примере для cookie глобально зафиксирована версия 0.7.0, а qs переопределяется только при необходимости для express.

Почему в Deno нет поля devImports?

Чтобы понять, почему Deno не выделяет зависимости для разработки в манифесте пакета, важно разобраться, какую задачу они решают.

При развёртывании приложения часто нужно устанавливать только те зависимости, которые действительно используются в исполняемом коде. Это помогает ускорить запуск и уменьшить размер развёрнутого приложения.

Исторически этого добивались, выделяя зависимости для разработки в отдельное поле devDependencies файла package.json. При развёртывании приложения devDependencies не устанавливаются — устанавливаются только зависимости.

На практике такой подход оказался проблематичным. Легко забыть перенести зависимость из dependencies в devDependencies, когда она из зависимости времени выполнения становится зависимостью для разработки. Кроме того, некоторые пакеты, которые по смыслу являются зависимостями «для разработки», например (@types/*), часто указываются в dependencies в файлах package.json. В результате они устанавливаются в production, хотя в этом нет необходимости.

Deno предлагает два способа устанавливать зависимости только для production:

  • deno install --prod — исключает devDependencies из package.json. Также можно передать --skip-types, чтобы дополнительно исключить пакеты @types/*.
  • deno install --entrypoint — устанавливает только зависимости, которые прямо или транзитивно импортируются указанным файлом точки входа. При использовании вместе с --prod зависимости, используемые только для типов, также исключаются из графа модулей.

Дополнительные сведения см. в справочнике по команде deno install.

HTTPS-импорты

Deno может импортировать модули напрямую по URL-адресам https: — как непосредственно в коде, так и через карту импортов deno.json. Это удобно для небольших скриптов в одном файле, но для приложений рекомендуются реестры (JSR, npm): HTTPS-импорты могут ссылаться на разные версии в разных файлах, не управляются с помощью deno add/deno install и требуют доверия к серверу, с которого загружаются. Чтобы зафиксировать их версии и хранить локально, см. раздел о локальном хранении зависимостей.

Дополнительные сведения

  • Публикация пакетов: JSR, npm с помощью deno pack и выбор реестра.
  • Управление цепочкой поставок: работа с lock-файлом, минимальный возраст зависимостей, процессы аудита и базовая настройка CI.
  • Закрытые репозитории: аутентификация на удалённых хостах модулей с помощью DENO_AUTH_TOKENS. О закрытых реестрах npm см. раздел Поддержка npm.

Последнее обновление: 25 июня 2026 г.

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

Spec-Zone.ru

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