Node.js. Утилиты npm и npx
23.07.2021
Теги: CLI • JavaScript • Web-разработка • Команда • Установка
Утилита npm
Утилита npm
— это менеджер пакетов, который входит в состав Node.js. Пакетом называется один или несколько js-файлов, представляющих собой какую-то библиотеку или инструмент. Менеджер пакетов предназначен для скачивания пакетов из облачного сервера, либо для загрузки (публикации) пакетов на этот сервер.
1. Инициализация проекта
Для создания нового проекта нужно создать директорию проекта, перейти в нее и выполнить команду
> npm init # в директории проекта
В процессе инициализации, npm
задаст несколько вопросов на тему того как должен называться проект, какая у него должна быть версия, описание и тому подобное. В конце npm
спросит все ли правильно и покажет содержимое файла package.json
, который и станет основой нового проекта.
2. Файл package-lock.json
Сразу после установки хотя бы одного пакета, рядом с package.json
будет создан файл package-lock.json
, который будет обновляться каждый раз при добавлении новой зависимости. В этом файле содержится описание состояния текущей иерархии используемых в приложении модулей: их точные версии и точные версии используемых ими пакетов и так до конца. При развертывании приложения в новой среде наличие файла package-lock.json
гарантирует, что будут установлены версии тех пакетов, которые использовались в разработке в последний раз.
npm ci
игнорирует файл package.json
и устанавливает модули, руководствуясь только файлом package-lock.json
.
3. Установленные пакеты
Получить список всех установленных в директории проекта npm-пакетов можно с помощью команды
> npm list # в директории проекта
Дополнительная опция --all
команды list
выводит все пакеты в виде дерева
> npm list --all # в директории проекта
Получить список всех установленных глобально npm-пакетов (см.ниже) можно с помощью команды
> npm --global list > npm -g list
4. Подробная информация о пакете
Посмотреть подробную информацию о пакете, доступного через npm-репозиторий
> npm view package-name
> npm view cowsay cowsay@1.5.0 | MIT | deps: 4 | versions: 20 cowsay is a configurable talking cow https://github.com/piuccio/cowsay keywords: cow, cowsay, cowthink, figlet, talking, ASCII ..........
Получить информацию из npm-репозитория о последней доступной версии пакета
> npm view package-name version
$ npm view cowsay version 1.5.0
5. Локальная установка пакетов
Установить все пакеты из секций dependencies
и devDependencies
файла package.json
:
> npm install
Установить все пакеты из секции dependencies
файла package.json
(для production сервера)
> npm install --production
Установить пакет package-name
, но не добавлять его в файл package.json
:
> npm install package-name --no-save
Установить пакет package-name
и добавить в секцию devDependencies
файла package.json
:
> npm install package-name --save-dev > npm install -D package-name
Установить пакет package-name
и добавить в секцию dependencies
файла package.json
:
> npm install package-name --save-prod > npm install -P package-name > npm install package-name
6. Локальное удаление пакетов
Удалить пакет package-name
, но не удалять его из файла package.json
:
> npm uninstall package-name
Удалить пакет package-name
и удалить его из секции devDependencies
файла package.json
:
> npm uninstall package-name --save-dev > npm uninstall -D package-name
Удалить пакет package-name
и удалить его из секции dependencies
файла package.json
:
> npm uninstall package-name --save > npm uninstall -S package-name
7. Глобальная установка пакета
По умолчанию npm будет устанавливать все пакеты в локальной директории, в которым мы сейчас работаем (директория проекта). Если нужно, чтобы пакет был доступен всем приложениям, его нужно установить глобально. Но это не лучшее решение — разные проекты могут требовать разные версии одного пакета. Глобально установленный пакет будет нормально работать в одном проекте и вызывать ошибку в другом.
> npm install --global package-name > npm install -g package-name
npm config get prefix
.
8. Глобальное удаление пакета
Так что если из-за глобально установки пакета возникли трудности — можно удалить его с помощью команды
> npm uninstall --global package-name > npm uninstall -g package-name
9. Локальное обновление пакетов
Обновить один пакет или все пакеты проекта (нужно выполнять из директории проекта):
> npm update package-name # обновить пакет в директории проекта > npm update # обновить все пакеты проекта
Чтобы узнать, вышли ли новые версии используемых в проекте пакетов
> npm outdated
10. Как безопасно обновляться
Некоторые из доступных обновлений пакетов представляют собой мажорные релизы, обновления до которых не произойдёт при выполнении npm update
. Обновление до мажорных релизов не производится, так как они могут содержать серьёзные изменения, не обладающие обратной совместимостью.
Для того, чтобы обновиться до новых мажорных версий всех используемых пакетов, нужно глобально установить пакет
> npm install --global npm-check-updates
Теперь можно посмотреть, какие пакеты можно обновить (без внесения каких-либо изменений):
> ncu Checking package.json [====================] 4/4 100% ..........
- Red = major upgrade
- Cyan = minor upgrade
- Green = patch upgrade
Убедившись, что обновление достаточно безопасно, можно выполнять следующую команду:
> ncu -u Upgrading package.json [====================] 4/4 100% ..........
Эта команда обновит файл package.json
, внеся изменения в указания о подходящих версиях пакетов в разделы dependencies
и devDependencies
. Это позволит npm
обновить пакеты, используемые в проекте, до новых мажорных версий при запуске команды npm update
.
Если нужно установить самые свежие версии пакетов для только что только что загруженного проекта, в котором пока нет директории node_modules
, то, вместо npm update
, выполняем команду npm install
.
11. Глобальное обновление пакетов
Обновить один пакет или все пакеты, установленные глобально (можно выполнять из любого места):
> npm update --global package-name # обновить глобальный пакет > npm update --global # обновить все глобальные пакеты
12. Установка конкретной версии
Установка старой версии npm-пакета может понадобиться для решения проблем совместимости:
> npm install package@version # локально, из директории проекта > npm install --global package@version # глобально, из любого места
Узнать, какие версии некоего пакета имеются в npm-репозитории
> npm view package-name versions
> npm view cowsay versions [ '1.0.0', '1.0.1', '1.0.2', '1.0.3', '1.1.0', '1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5', '1.1.6', '1.1.7', '1.1.8', '1.1.9', '1.2.0', '1.2.1', '1.3.0', '1.3.1', '1.4.0', '1.5.0' ] > npm install cowsay@1.4.0
13. Запуск скриптов
Файл package.json
часто содержит секцию scripts
, которая содержит скрипты для автоматизации рутиных задач. Можно запустить или остановить веб-сервер, собрать приложение, прогнать тесты и так далее.
{ .......... "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, .......... }
Запускать эти команды можно с помощью команды
> npm run-script command > npm run command
К переменной окружения PATH
будет добавлен путь node_modules/.bin
, так что в первую очередь будут выполнены локальные скрипты проекта.
run
, например npm start
, npm stop
или npm test
.
14. Справка по менеджеру пакетов
У менеджера пакетов есть подробная справка по все командам
> npm npm <command> Usage: npm install install all the dependencies in your project npm install <foo> add the <foo> dependency to your project npm test run this project's tests npm run <foo> run the script named <foo> npm <command> -h quick help on <command> npm -l display usage info for all commands npm help <term> search for help on <term> (in a browser) npm help npm more involved overview (in a browser) All commands: access, adduser, audit, bin, bugs, cache, ci, completion, config, dedupe, deprecate, diff, dist-tag, docs, doctor, edit, exec, explain, explore, find-dupes, fund, get, help, hook, init, install, install-ci-test, install-test, link, ll, login, logout, ls, org, outdated, owner, pack, ping, prefix, profile, prune, publish, rebuild, repo, restart, root, run-script, search, set, set-script, shrinkwrap, star, stars, start, stop, team, test, token, uninstall, unpublish, unstar, update, version, view, whoami Specify configs in the ini-formatted file: C:\Users\Evgeniy\.npmrc or on the command line via: npm <command> --key=value More configuration info: npm help config Configuration fields: npm help 7 config npm@7.8.0 C:\Users\Evgeniy\AppData\Roaming\npm\node_modules\npm
Для примера, посмотрим справку по команде install
(в браузере)
> npm help install
Утилита npx
Существует множество утилит в виде пакетов (например, create-react-app
), которые изначально предполагалось устанавливать глобально. Запускать их из командной строки было очень просто — достаточно ввести имя утилиты в консоли. Однако мы уже знаем, что глобальная установка пакетов создает множество проблем.
Конечно, мы можем что-нибудь придумать, чтобы избежать проблем с глобальной установкой таких утилит. Например, установить пакет create-react-app
глобально, запустить один раз из директории проекта, чтобы создать React-приложение — и сразу после этого удалить.
Еще один способ — установить create-react-app
локально в какую-то временную директорию. И добавить команду в секцию scripts
файла package.json
. После этого можно запускать утилиту из этой директории с помощью npm run
, указывая путь к директории проекта, который надо создать.
> cd /path/to/temp/dir/ > npm install create-react-app # установка create-react-app в какой-то временной директории
{ .......... "scripts": { .......... "create-app": "create-react-app", .......... }, .......... "dependencies": { "create-react-app": "^4.0.3" } }
> npm run-script create-app /path/to/project/dir/hello-world # запуск утилиты, создание проекта hello-world
create-react-app
получился не слишком удачным. Потому что утилита предназначена для развертывания React-приложения в пустой директории проекта. Поэтому мы не можем установить create-react-app
локально, как dev-зависимость проекта — и вынуждены устанавливать во временной директории. Но в случае других пакетов такого рода можно установить пакет локально как dev-зависимость проекта — и запускать через run-script
.
В общем, получается сложно и хлопотно — тут на помощь приходит утилита npx
, которая позволяет:
- во-первых, легко запустить локально установленный пакет без
run-script
- во-вторых, легко запустить пакет, который не установлен ни локально, ни глобально
- в-третьих, запускать разные версии одной утилиты с помощью
package@version
Посмотрим на то, как использовать команду npx
на примере простой утилиты cowsay
. Это абсолютно бессмысленная утилита, которая выводит на экран «говорящую» корову — но подходит в качестве примера. Если пакет cowsay
установлен глобально, выполнение в командной строке команды cowsay hello
приведёт к выводу в консоль «говорящей» коровы.
> cowsay hello _______ < hello > ------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Если пакет cowsay
не установлен глобально, подобная команда выдаст ошибку:
> cowsay hello "cowsay" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
Используем команду npx
, когда пакет cowsay
не установлен глобально:
> npx cowsay hello _______ < hello > ------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Утилита npx
скачает пакет cowsay
из npm-репозитория, установит во временную директорию и выполнит утилиту. Что важно — не загрязняя глобальное пространство. Так что при использовании npx
необходимости в глобальной установке пакетов больше нет.
Если запускать npx
из директории проекта, то сначала будет выполнен поиск в node_modules/.bin
. Если пакет уже установлен локально — он будет выполнен. А если не установлен — npx
найдет его в npm-репозитории, скачает, установит во временную директорию и выполнит.
Несколько раз встречал команду npm it
и никак не мог понять, что она означает. Оказывается, это синоним команды npm install-test
, которая выполняет последовательно две команды:
> npm install > npm test
Поиск: CLI • JavaScript • Web-разработка • Команда • Установка • Node.js • npm • npx • package • пакет