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

Как использовать локальную версию модуля в node.js. Например, в своем приложении я установил кофейный скрипт:

npm install coffee-script

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

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


person typeoneerror    schedule 13.03.2012    source источник
comment
Во многих инструкциях, которые я прочитал, говорится что-то вроде npm install niftycommand, а затем niftycommand. Но это никогда не сработает, если на вашем пути нет ./node_modules/.bin, не так ли?   -  person Bennett McElwee    schedule 20.09.2016
comment
Здесь есть очень хорошая запись: firstdoit.com/ - в основном он рекомендует вам поместить вашу coffee команду в раздел npm scripts, например, "build": "coffee -co target/directory source/directoy", so you can run npm run build` из терминала впоследствии.   -  person Benny Neugebauer    schedule 23.01.2017
comment
@BennyNeugebauer действительно, это то, что я делал в последнее время, вместо того, чтобы возиться с PATH   -  person typeoneerror    schedule 02.02.2017
comment
Используйте npx, который поставляется с npm 5.2.0 medium.com/@maybekatz/   -  person onmyway133    schedule 14.03.2018


Ответы (24)


ОБНОВЛЕНИЕ. Как указывает Сеён Чжон в своем ответе ниже, начиная с npm 5.2.0 вы можете использовать npx [command], что более удобно.

СТАРЫЙ ОТВЕТ для версий до 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

запускать правильную копию кофе независимо от того, где я

$ 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
person regular    schedule 01.03.2013
comment
вы даже можете пойти еще дальше и alias coffee="npm-exec coffee" - person regular; 18.03.2013
comment
Однако npm bin не является независимым от текущего рабочего каталога; его вывод изменяется в зависимости от текущего каталога. Может ты имел ввиду npm bin -g? - person rakslice; 03.10.2013
comment
Результат меняется, когда вы cd в другой проект. Это не меняется, когда вы записываете компакт-диск в проект. npm bin ищет в цепочке «родительских каталогов» cwd каталог node_modules. Это именно то поведение, которое требуется, если вы специально хотите использовать двоичные файлы модулей, перечисленных в package.json проекта. - person regular; 03.10.2013
comment
Было бы неплохо, если бы можно было каким-то образом автоматически обновлять переменную PATH при изменении PWD (то есть, чтобы убрать необходимость в _1 _) ... - person namuol; 11.11.2013
comment
Обновление: см. мой ответ ниже, чтобы узнать о решении, которое автоматически обновляет $ PATH прозрачно. - person namuol; 11.11.2013
comment
@SyntheCypher, я не пользователь winodws, а вы пробовали cygwin? В оболочке cygwin он должен работать точно так же. - person regular; 27.04.2014
comment
единственная проблема с этим решением состоит в том, что каждый раз, когда вы используете команду, вы расширяете путь. - person philosodad; 02.10.2014
comment
о Боже! мне действительно нужно делать что-то подобное, чтобы мои локальные модули работали? объяснить это команде непрактично! нет ничего проще? - person Alexian; 24.04.2015
comment
Вы всегда можете использовать сценарии npm, поскольку они всегда сначала ищут локальные двоичные файлы. Вы можете установить псевдонимы для каждого из ваших двоичных файлов или просто использовать общие имена, такие как build. - person Joe Zim; 22.09.2015
comment
@philosodad, на самом деле нет. PATH вернется к тому, что было до вызова команды. Установка переменной среды в той же строке перед запуском команды влияет только на среду этой команды. - person regular; 22.09.2015
comment
Вы также можете запрограммировать эти сценарии в свой раздел сценариев package.json, что не требует изменения вашего пути. - person Kraken; 06.10.2015
comment
@Alexian есть также zxc, который немного упрощает это: npmjs.com/package/zxc (см. мой ответ ниже) - person Nathan; 19.01.2016
comment
Для Windows это файл .bat, который выполняет то же самое gist.github.com/joeyespo/a532500f1040f11f3/ а> - person Joe; 11.05.2016
comment
Чтобы избежать ложных срабатываний для дважды установленных двоичных файлов в $PATH, вы должны использовать PATH=$(npm bin):${$(which node)%/node}, поскольку двоичным файлам в npm bin нужен путь для node. - person wpcarro; 05.01.2018
comment
Для пользователей Windows добавьте это в путь к среде: %AppData%\npm - person Adedoyin Akande; 28.10.2019
comment
проблема с npx в том, что он скачивает зависимости КАЖДЫЙ РАЗ! (они уже местные ..) - person Bernardo Dal Corno; 11.09.2020

Хороший пример

Вам больше не нужно манипулировать $PATH!

Из [email protected], npm поставляется с npx пакетом, который позволяет запускать команды из локального node_modules/.bin или из центрального кеша.

Просто запустите:

$ npx [options] <command>[@version] [command-arg]...

По умолчанию npx проверяет, существует ли <command> в $PATH или в локальных двоичных файлах проекта, и выполняет это.

Вызов npx <command>, когда <command> еще не находится в вашем $PATH, автоматически установит пакет с этим именем из реестра NPM и вызовет его. Когда это будет сделано, установленный пакет не будет нигде в ваших глобальных файлах, поэтому вам не придется беспокоиться о загрязнении в долгосрочной перспективе. Вы можете предотвратить такое поведение, указав параметр --no-install.

Для npm < 5.2.0 вы можете установить пакет npx вручную, выполнив следующую команду:

$ npm install -g npx
person Seyeong Jeong    schedule 18.07.2017
comment
Мне не нравится устанавливать сторонние глобальные пакеты npm, в то время как npm и package.json предоставляют почти такую ​​же функциональность. - person guneysus; 28.03.2018
comment
Если путь должен быть строкой. Появляется полученное неопределенное сообщение, вот исправление: github.com/zkat/npx/ issues / 144 # issuecomment-391031816 - person Valeriy Katkov; 02.08.2018
comment
Это хороший ответ. Но я просто хочу сказать, что npx отстой. Это должно было быть npm run или npm exec или что-то в этом роде. - person William Entriken; 25.10.2018
comment
@WilliamEntriken По некоторым причинам npm run [my-local-package] не работает на моем Ubuntu, хотя, похоже, он работает на устройстве Windows. - person Clockwork; 03.07.2019
comment
Этот ответ также должен включать, как зарегистрировать двоичный файл в файле package.json для издателей, docs.npmjs.com/cli/v7/configuring-npm/package-json#bin - person Tofandel; 06.04.2021
comment
Как ни странно, этот ответ включает один (и только один?) Абзац дословно - ха, изображение, используемое в этом ответе, также является обманом - от это сообщение в блоге. Не могу сказать, кто был первым, хотя догадываюсь. ;^D В любом случае, этот блог предоставляет много контекста. - person ruffin; 25.05.2021

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

$ $(npm bin)/<binary-name> [args]

e.g.

$ $(npm bin)/bower install
person jassa    schedule 13.12.2014
comment
Мне нравится это простое и универсальное решение. Делает псевдоним ненужным. - person Matt Montag; 01.06.2015
comment
Кажется, это следующее лучшее решение, которое элегантнее и безопаснее, чем необходимость делать export PATH="./node_modules/.bin:$PATH" - person jontsai; 10.09.2015
comment
@ inf3rno это команда $(npm bin)/jasmine, а не node $(npm bin)/jasmine (вы, наверное, догадались, но поясняете для других). - person jassa; 19.08.2016
comment
Неплохое решение, но оно не запускается в стандартной командной строке Windows с $. Я считаю, что лучше поместить его в раздел сценариев package.json, поскольку он более совместим. - person Timothy Gonzalez; 01.10.2016

Используйте 1_

После использования npm для установки пакета bin в локальный ./node_modules каталог измените package.json, чтобы добавить <script name> следующим образом:

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

Было бы неплохо, если бы в npm install была опция --add-script или что-то в этом роде, или если бы npm run работал без добавления в блок скриптов.

person jla    schedule 16.02.2015
comment
Я обнаружил, что этот подход более единообразен при работе с несколькими разработчиками в проекте - он позволяет избежать необходимости настраивать что-либо локально ... вы просто npm install, тогда у вас есть доступ к вашим зависимостям разработчика. Единственный незначительный недостаток - вам нужно npm run eslint (или что-то еще). Вы можете создать сценарий под названием start, который запускает gulp, так что вам нужно будет только ввести npm start, чтобы запустить сервер разработки. Довольно крутые штуки и никакого безумия, так что вы все равно нравитесь вашим друзьям по Windows. :) - person jpoveda; 22.09.2015
comment
добавление псевдонима для размещения $ (npm bin) на вашем пути - это умно, но тот факт, что это будет работать для людей без локальной конфигурации, покоряет мое сердце - person Conrad.Dean; 25.03.2016
comment
для этого нужно больше голосов! Передайте аргументы в свои сценарии после --, например: npm run learnyounode -- --normal-switches --watch -d *.js - person ptim; 17.06.2016
comment
Я тоже считаю это лучшим решением. Здесь есть подробное объяснение: lostechies.com/derickbailey/2012/04/24/ - person adampasz; 24.07.2016
comment
Я обычно этим занимаюсь, но по некоторым причинам на устройстве Ubuntu npm run ts-node у меня не работает. Мне просто нужно вернуться к npx. - person Clockwork; 03.07.2019
comment
Я пошел на поиски ответа на этот вопрос именно потому, что не хочу использовать скрипты package.json. В частности, я не хочу помещать свои команды в файл package.json, если мой проект состоит из нескольких языков и фреймворков. Помещение команд в package.json делает его несовместимым с другими языками. - person SOFe; 10.07.2021

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

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

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

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

person Linus Thiel    schedule 13.03.2012
comment
это, наверное, лучшее решение. Я также создал в своем проекте сценарий bash под названием watch: ./node_modules/.bin/coffee --output lib/ --compile --bare --watch src - person typeoneerror; 13.03.2012
comment
Опасно, Уилл Робинсон! Использование относительных путей в вашем $ PATH открывает брешь в безопасности размером с планету, особенно если вы поместите их прямо перед собой в качестве первого элемента. Если каталог, в котором вы находитесь, доступен для записи всем (скажем, где-нибудь в /tmp), любой процесс или пользователь может захватить ваш сеанс, поместив туда вредоносные версии обычных команд (например, ls, cp и т. Д.). Они могут порождать «невидимые» суб-оболочки, улавливающие ваши пароли и т. Д. - person ack; 01.03.2014
comment
будет работать только в корне и ни в каких других местах. alias npm-exec='PATH=$(npm bin):$PATH' круче. - person oligofren; 05.05.2015
comment
Насколько это плохо, если вы укажете это не как первое значение в вашем PATH, а последнее (используя форму $(npm bin))? поэтому они не могут перезаписать ваш существующий материал, и вы бы уже доверяли исполняемым файлам в каталоге npm bin независимо от PATH var; будет ли модель угрозы такова, что а) кто-то злонамеренный получит доступ к вашей файловой системе, б) они добавят исполняемые файлы с именами, близкими к этим системным инструментам, и в) вы ошиблись при вводе? Попытка понять сценарии, которые делают это плохо, учитывая, что вы уже доверяете сторонним исполняемым файлам при использовании npm установленных программ. - person osdiab; 15.07.2016
comment
Вы можете проделывать трюки с оболочкой с псевдонимом или вручную, и это работает, но это не совсем идеально. - person killscreen; 18.12.2017

Используйте npm-run.

Из ридми:

npm-run

Найти и запустить локальные исполняемые файлы из node_modules

Любой исполняемый файл, доступный для сценария жизненного цикла npm, доступен для npm-run.

использование

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

Установка

$ npm install -g npm-run
person mightyiam    schedule 28.10.2016
comment
Больше не см. Npx, упомянутый выше ... stackoverflow.com/a/45164863/3246805 - person t.j.; 01.09.2017

обновление: если вы используете недавний npm (версия ›5.2)

Вы можете использовать:

npx <command>

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 <command> <arg0> <arg1> ...

Например

Чтобы запустить wdio, установленный в локальном каталоге node_modules, выполните:

npm-exec wdio wdio.conf.js

т.е. он будет работать .\node_modules\.bin\wdio wdio.conf.js

person Dheeraj Bhaskar    schedule 03.08.2016
comment
Это не работает при передаче более одного аргумента. Например. npm-exec gulp ‹some_task› - person OK999; 04.10.2016
comment
@ OK9999 Я уверен, что некоторые незначительные изменения позволят передавать аргументы (потому что, когда вы передадите их здесь, они будут заключены в кавычки); Я предлагаю скопировать и вставить файл gulp из bin в корень вашего проекта (требуются некоторые модификации файла, но он будет работать без написания нового кода и т. Д.) - person Dheeraj Bhaskar; 11.10.2016
comment
Да, в итоге я так и поступил. Папка node_modules должна находиться в папке, где существует gulpfile. - person OK999; 11.10.2016

Если вы хотите сохранить npm, то npx должен делать то, что вам нужно.


Если вам подходит переход на пряжу (замена npm на facebook), вы можете позвонить:

 yarn yourCmd

сценарии внутри package.json будут иметь приоритет, если ничего не будет найдено, они заглянут в папку ./node_modules/.bin/.

Он также выводит то, что он запустил:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

Таким образом, вам не нужно настраивать сценарии для каждой команды в вашем package.json.


Если у вас есть сценарий, определенный в .scripts внутри вашего package.json:

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tsc будет эквивалентно yarn run tsc или npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc
person k0pernikus    schedule 11.08.2017

Решение PATH имеет проблему, заключающуюся в том, что если $ (npm bin) помещается в ваш .profile / .bashrc / etc, он оценивается один раз и навсегда устанавливается в тот каталог, в котором путь был сначала оценен. Если вместо этого вы измените текущий путь, тогда каждый раз, когда вы запускаете скрипт, ваш путь будет расти.

Чтобы обойти эти проблемы, я создал функцию и использовал ее. Он не изменяет вашу среду и прост в использовании:

function npm-exec {
   $(npm bin)/$@  
}

Затем это можно использовать следующим образом, не внося никаких изменений в вашу среду:

npm-exec r.js <args>
person Bob9630    schedule 17.08.2015
comment
Мне это нравится! Я просто назвал свою функцию n - person jontsai; 10.09.2015
comment
Отлично! Спасибо, что поделился. Я добавил версию рыбьей раковины ниже. - person LeOn - Han Li; 19.05.2017

Я предпочитаю не полагаться на псевдонимы оболочки или другой пакет.

Добавив простую строку в раздел scripts вашего package.json, вы можете запускать локальные команды npm, например

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}
person guneysus    schedule 11.03.2018

Если вы хотите, чтобы ваша переменная PATH правильно обновлялась в зависимости от вашего текущего рабочего каталога, добавьте это в конец вашего .bashrc-эквивалента (или после всего, что определяет PATH):

__OLD_PATH=$PATH
function updatePATHForNPM() {
  export PATH=$(npm bin):$__OLD_PATH
}

function node-mode() {
  PROMPT_COMMAND=updatePATHForNPM
}

function node-mode-off() {
  unset PROMPT_COMMAND
  PATH=$__OLD_PATH
}

# Uncomment to enable node-mode by default:
# node-mode

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

Вы можете включить и отключить его в своем терминале, запустив соответственно node-mode и node-mode-off.

person namuol    schedule 11.11.2013

Я всегда использовал тот же подход, что и @guneysus, для решения этой проблемы, который создает сценарий в файле package.json и использует его для запуска npm run script-name.

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

Например, я загрузил проект Angular и не хотел устанавливать Angular CLI глобально. Итак, с установленным npx вместо использования глобальной команды angular cli (если бы я ее установил), например:

ng serve

Я могу сделать это с консоли:

npx ng serve

Я писал о NPX, и это более подробно.

person Jair Reina    schedule 30.08.2018

TL; DR: используйте npm exec с _2 _.


Команда npx, которая упоминалась в других ответах, была полностью переписана в npm@7, который по умолчанию поставляется с node@15 и может быть установлен на node@>=10. Реализация теперь совпадает с недавно введенной командой npm exec, которая похожа, но не равна предыдущей реализации команды npx.

Одно отличие, например, что он всегда в интерактивном режиме спрашивает, следует ли загружать зависимость, если она еще не установлена ​​(также может быть перезаписана параметрами --yes или --no).

Вот пример для npm exec. Двойные дефисы (--) отделяют npm exec параметры от фактических параметров команды:

npm exec --no -- jest --coverage

См. Также обновленную официальную документацию для npm exec.

person ssc-hrep3    schedule 12.03.2021

zxc похож на "bundle exec" для nodejs. Это похоже на использование PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
person Nathan    schedule 18.01.2016

Такое же принятое решение @regular, но со вкусом рыбной скорлупы

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end
person Pioneer Skies    schedule 08.09.2015

Вы также можете использовать direnv и изменять переменную $ PATH только в своей рабочей папке.

$ cat .envrc
> export PATH=$(npm bin):$PATH
person Erem    schedule 16.11.2016

Добавьте этот скрипт в свой .bashrc. Затем вы можете позвонить coffee или что-нибудь еще локально. Это удобно для вашего ноутбука, но не используйте его на сервере.

DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;

примечание: этот сценарий создает псевдоним команды cd, и после каждого вызова cd он проверяет node_modules/.bin и добавляет его в ваш $PATH.

note2: вы можете изменить третью строку на NODE_MODULES=$(npm bin);. Но это сделало бы команду cd слишком медленной.

person Tsutomu Kawamura    schedule 19.12.2016
comment
Используйте $(npm bin) вместо жесткого кодирования ./node_modules/.bin. - person bfontaine; 25.01.2017
comment
Хм, $(npm bin) кажется слишком медленным для использования с каждой cd командой. Я восстановил код и добавил к нему примечание. - person Tsutomu Kawamura; 26.01.2017

Для Windows используйте это:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
person aLx13    schedule 02.02.2017

Я столкнулся с той же проблемой, и мне не очень нравится использовать псевдонимы (как предлагается обычный), и если вы не используете Мне они тоже не нравятся, вот еще один обходной путь, который я использую. Сначала вам нужно создать крошечный исполняемый сценарий bash, скажем, setenv.sh:

#!/bin/sh

# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"

# execute the rest of the command
exec "$@"

а затем вы можете использовать любые исполняемые файлы в вашем локальном /bin с помощью этой команды:

./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt

Если вы используете scripts в package.json, тогда:

...,
scripts: {
    'start': './setenv.sh <command>'
}
person nkh    schedule 30.12.2014
comment
этот сценарий setenv не требуется для сценариев package.json. npm уже добавляет локальный каталог node_modules / .bin к пути для вас при выполнении npm run {scripts}. - person jasonkarns; 06.02.2015

Я хотел бы знать, небезопасная / плохая идея, но, немного подумав, я не вижу здесь проблемы:

Изменив небезопасное решение Линуса, чтобы добавить его в конец, используя npm bin для поиска каталога и заставляя скрипт вызывать npm bin только тогда, когда package.json присутствует в родительском элементе (для скорости), это то, что я придумал для zsh:

find-up () {
  path=$(pwd)
  while [[ "$path" != "" && ! -e "$path/$1" ]]; do
    path=${path%/*}
  done
  echo "$path"
}

precmd() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi
}

Для bash вместо использования хука precmd вы можете использовать переменную $PROMPT_COMMAND (я не тестировал это, но вы поняли):

__add-node-to-path() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi   
}

export PROMPT_COMMAND="__add-node-to-path"
person osdiab    schedule 15.07.2016
comment
Добавление npm bin в конец $PATH может не выполнить то, что ожидает пользователь: в основном другой исполняемый файл, но, скорее всего, глобально установленный пакет с другой версией! - person LoganMzz; 08.11.2017

Я Windows пользователь, и вот что у меня сработало:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

Удачи.

person Aakash    schedule 26.01.2017

Если вы используете fish shell и не хотите добавлять в $path по соображениям безопасности. Мы можем добавить следующую функцию для запуска исполняемых файлов локального узла.

### run executables in node_module/.bin directory
function n 
  set -l npmbin (npm bin)   
  set -l argvCount (count $argv)
  switch $argvCount
    case 0
      echo please specify the local node executable as 1st argument
    case 1
      # for one argument, we can eval directly 
      eval $npmbin/$argv
    case '*'
      set --local executable $argv[1]
      # for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2... 
      # This is just how fish interoperate array. 
      set --erase argv[1]
      eval $npmbin/$executable $argv 
  end
end

Теперь вы можете запускать такие вещи, как:

n coffee

или более аргументов вроде:

n browser-sync --version

Обратите внимание: если вы bash пользователь, тогда ответы @ Bob9630 - это способ пойти, используя $@ bash, который недоступен в fishshell.

person LeOn - Han Li    schedule 19.05.2017

Предлагаю новое разработанное мною решение (05/2021)

Можно использовать lpx https://www.npmjs.com/package/lpx для

  • запустите двоичный файл, найденный в локальной папке node_modules / .bin
  • запустить двоичный файл, найденный в node_modules / .bin корня рабочей области, из любой точки рабочей области

lpx не загружает никаких пакетов, если двоичный файл не найден локально (т.е. не как npx)

Пример: lpx tsc -b -w будет запускать tsc -b -w с локальным пакетом машинописного текста

person Bruno Gasnier    schedule 16.05.2021
comment
Предлагается указать, созданы ли вами какие-либо связанные материалы. - person m4heshd; 22.05.2021

Включите кофейный скрипт в package.json с конкретной версией, необходимой для каждого проекта, обычно примерно так:

"dependencies":{
  "coffee-script": ">= 1.2.0"

Затем запустите npm install, чтобы установить зависимости в каждом проекте. Это установит указанную версию coffee-script, которая будет доступна локально для каждого проекта.

person almypal    schedule 13.03.2012
comment
да, я дошел до того, что сказал в своем вопросе. как мне конкретно назвать тот, который есть в моем проекте, кроме ./node_modules/.bin/coffee? - person typeoneerror; 13.03.2012
comment
Если вы запускали npm install с файлом package.json в основной папке вашего проекта, у вас должна быть папка ./node_modules/.bin/coffee в этой папке. Использование ./node_modules/coffee-script/bin/coffee запустит локальную версию coffee, в то время как просто запущенный coffee запустит глобальную установку. Если у вас есть другая версия coffee, установленная по другому пути в этой папке проекта, вы можете получить к ней доступ, используя ./path/to/this/installation/coffee. - person almypal; 13.03.2012
comment
У меня это не сработало. Я пытаюсь использовать svgo, и он работает только при глобальной установке. Я пробовал npm install svgo, а также npm install с package.json. Оба метода установлены успешно, но команда svgo по-прежнему недоступна. - person Ryan Wheale; 05.04.2013
comment
Grunt использует это с умом, и, ИМХО, другие пакеты тоже. Сначала вы устанавливаете пакет grunt-cli глобально, затем в каталог вашего проекта устанавливаете любую (измененную) версию пакета grunt, а затем, когда вы запускаете grunt, он будет использовать эту локальную версию. - person ack; 01.03.2014