Node.js. Утилиты npm и npx

23.07.2021

Теги: CLIJavaScriptWeb-разработкаКомандаУстановка

Утилита 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 • пакет

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.