Не все устанавливаемые зависимости, используются внутри кода как библиотеки. Некоторые нужны для различных утилитарных задач. К подобным пакетам относится eslint. Eslint - это программа для проверки кода на соответствие стандартам кодирования, она используется на Хекслете для проверки ваших решений как в практике к урокам так и в проектах, где вы будете устанавливать ее самостоятельно. Существует два способа ее установки, глобальный и локальный.

Глобальная установка позволяет установить eslint один раз и затем использовать его во всех необходимых пакетах, которые мы разрабатываем:

$ sudo npm install -g eslint
$ cd my-package
# eslint требует указать директорию, в которой нужно искать файлы для проверки. Точка означает текущую директорию.
$ eslint .

Хотя такой способ установки кажется заманчивым, все же, его стоит избегать. Глобальные зависимости не ставятся при первоначальной настройке пакета. То есть если мы выполним команду npm install в свежесклонированном репозитории, eslint не поставится, а значит придется устанавливать его отдельно. И это придется делать не только нам, но и всем кто участвует в разработке данного пакета. К тому же возможны проблемы с версиями. Если у кого-то стоит eslint старой версии, это может помешать нормальной проверке, и в такой ситуации не будет никакой возможности обновить версию пакета автоматически, это произойдет только если разработчик сам вспомнит о том, что пакет стоит обновить.

Поэтому наш выбор - локальная установка. Подобные пакеты всегда используются только при разработке, поэтому не забываем указывать флаг --save-dev во время локальной установки:

# В корне проекта
$ npm install --save-dev eslint

Но здесь нас ожидает сюрприз. Если попробовать его запустить как обычно, то bash скажет что команда не найдена (если, конечно, вы не установили его глобально ранее).

# В корне проекта
$ eslint .
bash: eslint: command not found

Такое поведение вполне ожидаемо. Вспомните, курс по основам командной строки и урок посвященный запуску программ из консоли. Исполняемый файл программы ищется по путям перечисленным в переменной окружения $PATH. В случае локальной установки, пакет устанавливается в директорию node_modules и только туда, никакие файлы больше никуда не добавляются. Другими словами bash не может узнать о том, что вы установили какую-то программу.

Из этой ситуации есть два выхода: правильный и неправильный. Неправильный - запустить исполняемый файл указав прямой путь. Для eslint он будет таким:

$ ./node_modules/.bin/eslint --init # инициализация линтера, во время которой создается конфигурационный файл
$ ./node_modules/.bin/eslint . # запуск проверки в текущей и всех вложенных директориях

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

$ npx eslint --init
$ npx eslint .

npx - специальная программа, которая автоматически устанавливается вместе с утилитой npm (убедитесь что вы ставите одну из последних версий Node.js). Она имеет такой формат работы:

$ npx <тут любая программа, установленная как локальный пакет NPM> <тут опции этой программы>

То есть npx добавляется слева к любому вызову, при этом сама команда никак не меняется.

Как работает npx? Эта утилита меняет $PATH для конкретного вызова, добавляя туда путь ./node_modules/.bin. Именно поэтому начинают работать локально установленные программы.

Например для написания тестов в js, мы используем тестовый фреймворк Jest. Он ставится как обычная зависимость в проект и дальше запускается через команду jest:

$ npm install --save-dev jest
# Пример вызова без npx
$ jest
bash: jest: command not found
# А теперь правильно
$ npx jest
# тут побежали тесты
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →