Полное руководство: Список npm пакетов без зависимостей
Узнайте, как выводить только установленные пользователем npm пакеты, исключая зависимости. Полное руководство с командами, примерами и альтернативными подходами для эффективного управления пакетами.
Как вывести список только тех пакетов npm, которые были установлены пользователем в текущей среде проекта, исключая их зависимости?
Содержание
- Основная команда для перечисления прямых зависимостей
- Понимание опций команды npm list
- Фильтрация по типу зависимости
- Дополнительные полезные команды списка
- Практические примеры и варианты использования
- Ограничения и альтернативные подходы
- Заключение
Основная команда для перечисления прямых зависимостей
Самый простой способ перечислить только установленные пользователем пакеты без их зависимостей:
npm list --depth=0
Эта команда отображает только пакеты, непосредственно установленные в вашем текущем проекте, игнорируя все вложенные зависимости. Флаг --depth=0 указывает npm остановиться после отображения непосредственных зависимостей, а не рекурсивно выводить всё дерево зависимостей.
# Альтернативный псевдоним
npm ls --depth=0
Обе команды выдают идентичный вывод, показывая только прямые зависимости вашего проекта в чистом и лаконичном формате.
Понимание опций команды npm list
Команда npm list предлагает несколько полезных опций, которые помогают контролировать, что отображается:
| Опция | Описание | Пример |
|---|---|---|
--depth=0 |
Показывает только прямые зависимости | npm list --depth=0 |
--omit=dev |
Показывает только зависимости для продакшена | npm list --omit=dev |
--parseable=true |
Формат вывода, удобный для машинной обработки | npm list --parseable=true |
--json |
Вывод в формате JSON | npm list --json |
Согласно документации npm, когда --depth=0 не указан, npm ls по умолчанию показывает только непосредственные зависимости корневого проекта, что именно то, что нужно для перечисления установленных пользователем пакетов без их зависимостей.
Фильтрация по типу зависимости
Пакеты npm делятся на разные типы, и вы можете соответствующим образом отфильтровать список:
Только зависимости для продакшена
Для npm версии 8 и выше можно использовать:
npm list --omit=dev
Эта команда показывает только зависимости для продакшена, исключая зависимости для разработки. Как отмечено в исследованиях, эта функция была введена в npm 8 и является рекомендуемым способом для исключения dev-зависимостей.
Только зависимости для разработки
К сожалению, нет прямого флага для отображения только зависимостей для разработки. Однако вы можете обойти это ограничение:
# Перечислить все пакеты и отфильтровать вручную
npm list | grep -E "└─.*@.*"
Или использовать bash для извлечения dev-зависимостей:
npm ls --depth=0 | grep -E "─.*"
Глобально установленные пакеты
Для перечисления глобально установленных пакетов без зависимостей:
npm list -g --depth=0
Дополнительные полезные команды списка
Вот несколько дополнительных вариантов команды npm list, которые могут быть полезны:
Подробная информация о пакетах
npm list --depth=0 --long
npm ls -l --depth=0
Флаг --long предоставляет дополнительную информацию о каждом пакете, включая версию, расположение и другие метаданные.
Вывод, удобный для парсинга
npm list --parseable=true --depth=0
Этот формат полезен для скриптов и программной обработки списка пакетов.
Вывод в формате JSON
npm list --json --depth=0
Генерирует структурированный вывод в формате JSON, который легко обрабатывается другими инструментами.
Практические примеры и варианты использования
Пример 1: Чистый снимок проекта
$ npm list --depth=0 ├── express@4.21.1 ├── lodash@4.17.21 └── webpack@5.89.0
Это показывает только пакеты, которые вы установили непосредственно, идеально подходит для понимания прямых зависимостей вашего проекта.
Пример 2: Только зависимости для продакшена
$ npm list --omit=dev --depth=0 ├── express@4.21.1 ├── lodash@4.17.21 └── webpack@5.89.0
Это отфильтровывает пакеты, предназначенные только для разработки, показывая только то, что необходимо для работы вашего приложения.
Пример 3: Работа с пакетными скриптами
Вы можете передать вывод другим командам:
npm list --depth=0 --parseable=true | cut -d: -f2 | xargs -I {} echo "Package: {}"
Это создает чистый список имен пакетов для дальнейшей обработки.
Ограничения и альтернативные подходы
Известные ограничения
-
Нет фильтра только для продакшена: Как отмечено в исследованиях, нет прямого способа исключить зависимости для продакшена, чтобы показать только зависимости для разработки.
-
Транзитивные зависимости: Даже с
--depth=0некоторые транзитивные зависимости могут все еще отображаться, если они помечены как требуемые несколькими пакетами. -
Различия версий npm: Флаг
--omit=devдоступен только в npm версии 8 и выше.
Альтернативные подходы
Использование package.json напрямую
Для более контролируемого подхода вы можете читать данные напрямую из package.json:
# Только зависимости для продакшена
cat package.json | jq '.dependencies | keys[]'
# Только зависимости для разработки
cat package.json | jq '.devDependencies | keys[]'
Использование сторонних инструментов
Рассмотрите возможность использования инструментов, таких как lean-package, упомянутых в исследованиях, для более продвинутого управления и фильтрации зависимостей.
Заключение
Чтобы эффективно перечислять только установленные пользователем пакеты npm, исключая их зависимости, запомните эти ключевые моменты:
- Основное решение: Используйте
npm list --depth=0илиnpm ls --depth=0для самого прямого подхода - Зависимости для продакшена: Используйте
npm list --omit=dev --depth=0(npm >=8) для исключения dev-зависимостей - Глобальные пакеты: Используйте
npm list -g --depth=0для глобально установленных пакетов - Альтернатива: Читайте данные напрямую из package.json с помощью инструментов вроде
jqдля более точного контроля
Эти команды предоставляют чистый и сфокусированный взгляд на зависимости вашего проекта без шума вложенных деревьев зависимостей. Выберите метод, который лучше всего соответствует вашим конкретным потребностям — будь то быстрый снимок, подготовка к развертыванию на продакшене или управление зависимостями для рабочих процессов разработки.