Как использовать исполняемые файлы из пакета, установленного локально в node_modules?
Как использовать локальную версию модуля в node.js
? Например, в моем приложении я установил coffee-script:
npm install coffee-script
Это устанавливает его в ./node_modules
, а команда coffee находится в ./node_modules/.bin/coffee
. Существует ли способ запустить эту команду, находясь в главной папке моего проекта? Я, похоже, ищу что-то похожее на bundle exec
в bundler. В основном, я хотел бы указать версию coffee-script, которую должны использовать все участники проекта.
Я понимаю, что могу добавить флаг -g
, чтобы установить его глобально, и тогда команда coffee будет работать везде, но что, если я хочу иметь разные версии coffee для разных проектов?
5 ответ(ов)
Для npm ⩾5.2.0 (обновлённый ответ)
Как отмечает Сейонг Чжонг в своём ответе ниже, с версии npm 5.2.0 вы можете использовать npx
, что является более удобным решением:
npx [команда]
Для старых версий npm <5.2.0 (старый ответ)
Проблема с добавлением
./node_modules/.bin
в ваш PATH заключается в том, что это работает только тогда, когда ваша текущая рабочая директория — корень вашей структуры проекта (т.е. место, где находится node_modules
).
Независимо от того, где вы находитесь, вы можете получить путь к локально установленным бинарным файлам с помощью команды
npm bin
Чтобы выполнить локально установленный бинарник coffee
, независимо от вашего местоположения в иерархии каталогов проекта, вы можете использовать такую конструкцию bash:
PATH=$(npm bin):$PATH coffee
Я создал для этого алиас под именем npm-exec:
alias npm-exec='PATH=$(npm bin):$PATH'
Теперь я могу использовать:
npm-exec coffee
чтобы запустить правильную версию coffee
, независимо от того, где я нахожусь:
$ pwd
/Users/regular/project1
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee
$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee
$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee
Больше не работает - удалено: https://github.com/npm/cli/pull/6289
Используйте команду npm bin
, чтобы получить каталог /bin для модулей node вашего проекта.
$ $(npm bin)/<имя-двойника> [аргументы]
Например:
$ $(npm bin)/bower install
Для использования установленного пакета, добавьте в ваш package.json
соответствующий скрипт следующим образом:
После установки пакета с помощью npm в локальную директорию ./node_modules
, отредактируйте package.json
, чтобы добавить название скрипта:
$ npm install --save learnyounode
$ nano package.json # или используйте другой редактор
>>> в package.json добавьте
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"learnyounode": "learnyounode"
},
...
$ npm run learnyounode
Было бы удобно, если бы у npm имелась опция --add-script для команды install или если бы npm run работал без необходимости добавления в блок scripts.
Обновление: Если у вас версия npm (больше 5.2)
Вы можете использовать:
npx <команда>
npx
ищет команду в директории .bin
вашего node_modules
.
Старый ответ:
Для Windows
Сохраните следующее в файл с названием npm-exec.bat
и добавьте его в ваш %PATH%
:
@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*
Использование
Теперь вы можете использовать это так:
npm-exec <команда> <аргумент0> <аргумент1> ...
Например
Чтобы выполнить wdio
, установленный в локальной директории node_modules, выполните:
npm-exec wdio wdio.conf.js
Это запустит .\node_modules\.bin\wdio wdio.conf.js
.
Обновление: Я больше не рекомендую этот метод, как по упомянутым причинам безопасности, так и из-за новейшей команды npm bin
. Оригинальный ответ ниже:
Как вы уже выяснили, все локально установленные бинарные файлы находятся в ./node_modules/.bin
. Чтобы всегда использовать бинарные файлы из этой директории вместо глобально доступных, если они есть, я предлагаю добавить ./node_modules/.bin
в начало вашего пути:
export PATH="./node_modules/.bin:$PATH"
Если вы добавите эту строчку в ваш ~/.profile
, то coffee
всегда будет ссылаться на ./node_modules/.bin/coffee
, если он доступен, в противном случае — на /usr/local/bin/coffee
(или на другую папку, в которой вы устанавливаете узловые модули).
Как узнать версию установленного npm пакета?
В чем разница между --save и --save-dev?
Как исправить ошибку npm без использования sudo
Как задать переменные окружения из файла package.json?
Как найти неиспользуемые пакеты в package.json?