7

Как использовать исполняемые файлы из пакета, установленного локально в node_modules?

11

Как использовать локальную версию модуля в node.js? Например, в моем приложении я установил coffee-script:

npm install coffee-script

Это устанавливает его в ./node_modules, а команда coffee находится в ./node_modules/.bin/coffee. Существует ли способ запустить эту команду, находясь в главной папке моего проекта? Я, похоже, ищу что-то похожее на bundle exec в bundler. В основном, я хотел бы указать версию coffee-script, которую должны использовать все участники проекта.

Я понимаю, что могу добавить флаг -g, чтобы установить его глобально, и тогда команда coffee будет работать везде, но что, если я хочу иметь разные версии coffee для разных проектов?

5 ответ(ов)

7

Для 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
1

Больше не работает - удалено: https://github.com/npm/cli/pull/6289

Используйте команду npm bin, чтобы получить каталог /bin для модулей node вашего проекта.

$ $(npm bin)/<имя-двойника> [аргументы]

Например:

$ $(npm bin)/bower install
0

Для использования установленного пакета, добавьте в ваш 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.

0

Обновление: Если у вас версия 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.

0

Обновление: Я больше не рекомендую этот метод, как по упомянутым причинам безопасности, так и из-за новейшей команды npm bin. Оригинальный ответ ниже:

Как вы уже выяснили, все локально установленные бинарные файлы находятся в ./node_modules/.bin. Чтобы всегда использовать бинарные файлы из этой директории вместо глобально доступных, если они есть, я предлагаю добавить ./node_modules/.bin в начало вашего пути:

export PATH="./node_modules/.bin:$PATH"

Если вы добавите эту строчку в ваш ~/.profile, то coffee всегда будет ссылаться на ./node_modules/.bin/coffee, если он доступен, в противном случае — на /usr/local/bin/coffee (или на другую папку, в которой вы устанавливаете узловые модули).

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь