Как использовать пакет, установленный локально в node_modules? - PullRequest
415 голосов
/ 13 марта 2012

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

npm install coffee-script

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

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

Ответы [ 22 ]

496 голосов
/ 01 марта 2013

ОБНОВЛЕНИЕ : Как Seyeong Jeong указывает в своем ответе ниже, начиная с 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
325 голосов
/ 18 июля 2017

Nice example

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

С npm@5.2.0, 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
88 голосов
/ 13 декабря 2014

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

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

, например

$ $(npm bin)/bower install
74 голосов
/ 16 февраля 2015

Используйте npm run[-script] <script name>

После использования 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 работал бы без добавления в блок scripts.

42 голосов
/ 29 октября 2016

Использование npm-run.

Из файла readme:

NPM-пробег

Поиск и запуск локальных исполняемых файлов из 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
40 голосов
/ 13 марта 2012

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

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

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

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

22 голосов
/ 18 августа 2015

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

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

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

Затем его можно использовать без изменений в вашей среде:

npm-exec r.js <args>
18 голосов
/ 11 августа 2017

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


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

 yarn yourCmd

сценарии внутри пакета. 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
5 голосов
/ 11 марта 2018

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

Добавляя простую строку в раздел 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"
  }
}
5 голосов
/ 11 ноября 2013

Если вы хотите, чтобы переменная 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 соответственно.

...