Как использовать локальную версию модуля в node.js
. Например, в моем приложении я установил coffee-script:
npm install coffee-script
Это устанавливает его, ./node_modules
и команда кофе находится в./node_modules/.bin/coffee
. Есть ли способ выполнить эту команду, когда я нахожусь в главной папке моего проекта? Я думаю, что я ищу что-то похожее на bundle exec
в комплекте. По сути, я бы хотел указать версию кофе-скрипта, которую должны использовать все участники проекта.
Я знаю, что могу добавить -g
флаг, чтобы установить его глобально, чтобы кофе работал в любом месте, но что, если я хотел бы иметь разные версии кофе на проект?
node.js
coffeescript
npm
node-modules
typeoneerror
источник
источник
npm install niftycommand
и тогдаniftycommand
. Но это никогда не сработает, если у вас нет пути ./node_modules/.bin, не так ли?coffee
команду вnpm scripts
раздел, например, после"build": "coffee -co target/directory source/directoy", so you can run
запуска npm run build` из терминала.npx
которое поставляется сnpm 5.2.0
medium.com/@maybekatz/...Ответы:
ОБНОВЛЕНИЕ : Как Seyeong Jeong указывает в своем ответе ниже, начиная с npm 5.2.0 вы можете использовать
npx [command]
, что более удобно.СТАРЫЙ ОТВЕТ для версий до 5.2.0 :
Проблема с нанесением
в ваш путь PATH заключается в том, что он работает только тогда, когда ваш текущий рабочий каталог является корнем структуры каталога вашего проекта (т. е. расположение
node_modules
)Независимо от того, какой у вас рабочий каталог, вы можете получить путь к локально установленным двоичным файлам с помощью
Чтобы выполнить локально установленный
coffee
двоичный файл независимо от того, где вы находитесь в иерархии каталогов проекта, вы можете использовать эту конструкцию bashЯ связал это с npm-exec
Итак, теперь я могу
запустить правильную копию кофе независимо от того, где я нахожусь
источник
alias coffee="npm-exec coffee"
npm bin
ищет цепочку «каталогов предков» в cwd для поиска каталога node_modules. Это именно то поведение, которое вам нужно, если вы хотите использовать двоичные модули модулей, перечисленные в package.json проекта.PATH
Будет вернуться к тому , что это было до вызова команды. Установка переменной среды в той же строке перед выполнением команды влияет только на среду этой команды.Вам не нужно
$PATH
больше манипулировать !Начиная с npm@5.2.0 , npm поставляется с
npx
пакетом, который позволяет запускать команды из локальногоnode_modules/.bin
или из центрального кэша.Просто запустите:
По умолчанию
npx
проверяет,<command>
существует$PATH
ли он в локальных или локальных двоичных файлах проекта, и выполняет его.Вызов,
npx <command>
когда его<command>
еще нет$PATH
, автоматически установит для вас пакет с этим именем из реестра NPM и вызовет его. Когда это будет сделано, установленный пакет не будет нигде в ваших глобальных, так что вам не придется беспокоиться о загрязнении в долгосрочной перспективе. Вы можете предотвратить это, предоставив--no-install
опцию.Для
npm < 5.2.0
, вы можете установитьnpx
пакет вручную, выполнив следующую команду:источник
npm
иpackage.json
предоставляет почти такую же функциональность.npx
что хромает. Это должно былоnpm run
илиnpm exec
или что - то.npm run [my-local-package]
не работает на моем Ubuntu, хотя, похоже, он работает на устройстве Windows.Используйте
npm bin
команду, чтобы получить каталог node modules / bin вашего проектанапример
источник
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
не,node $(npm bin)/jasmine
(вы, наверное, разобрались, но проясняете для других).использование
npm run[-script] <script name>
После использования npm для установки пакета bin в локальный
./node_modules
каталог изменитеpackage.json
его, добавив<script name>
вот так:Было бы хорошо, если бы в npm install была опция --add-script или что-то в этом роде или если npm run работал бы без добавления в блок scripts.
источник
npm install
получаете доступ к своим зависимостям dev. Единственный минус - вам нужноnpm run eslint
(или что-то еще). Вы можете создать скрипт с именем «start», который запускает gulp, поэтому вам нужно всего лишь набрать текст,npm start
чтобы запустить свой dev-сервер. Довольно классная штука и ничего хорошего, так что твои друзья из Windows по-прежнему любят тебя. :)--
:npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
у меня не работает. Я просто должен сделать репортаж в npx.Использование
npm-run
.Из readme:
NPM-бег
Найти и запустить локальные исполняемые файлы из node_modules
Любой исполняемый файл, доступный для сценария жизненного цикла npm, доступен для
npm-run
.Применение
Установка
источник
Обновление: я больше не рекомендую этот метод, как по упомянутым причинам безопасности, так и, что немаловажно, более новая
npm bin
команда. Оригинальный ответ ниже:Как вы узнали, все локально установленные двоичные файлы находятся в
./node_modules/.bin
. Для того, чтобы всегда запускать двоичные файлы в этом каталоге, а не глобально доступные двоичные файлы, если они есть, я предлагаю вам поставить./node_modules/.bin
первым на своем пути:Если вы поместите это в свой
~/.profile
,coffee
всегда будет,./node_modules/.bin/coffee
если доступно, в противном случае/usr/local/bin/coffee
(или любой другой префикс, под которым вы устанавливаете модули узлов).источник
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), любой процесс или пользователь может захватить ваш сеанс, поместив туда вредоносные версии обычных команд (напримерls
,cp
и т. Д.). Они могут порождать «невидимые» вложенные оболочки, собирающие ваши пароли, и так далее.alias npm-exec='PATH=$(npm bin):$PATH'
является дождевика.PATH
, а последнее (используя$(npm bin)
форму)? поэтому они не могут перезаписать ваш существующий материал, и вы уже доверяли бы исполняемым файлам вnpm bin
каталоге независимо отPATH
var; Будет ли модель угрозы такой: а) кто-то злоумышленник получит доступ к вашей файловой системе, б) добавит исполняемые файлы с именами, близкими к этим системным инструментам, и в) вы ошиблись в типе? Попытка понять сценарии, которые делают это плохо, учитывая, что вы уже доверяете сторонним исполняемымnpm
файлам при использовании установленных программ.Решение PATH имеет проблему, заключающуюся в том, что если $ (npm bin) помещается в ваш файл .profile / .bashrc / etc, он оценивается один раз и всегда устанавливается в любой каталог, в котором сначала был оценен путь. Если вместо этого вы измените текущий путь, то каждый раз, когда вы запускаете скрипт, ваш путь будет расти.
Чтобы обойти эти проблемы, я создал функцию и использовал ее. Он не изменяет вашу среду и прост в использовании:
Это может быть использовано следующим образом без каких-либо изменений в вашей среде:
источник
n
Если вы хотите сохранить npm, то npx должен делать то, что вам нужно.
Если вам подходит переход на пряжу (замена npm на facebook), вы можете позвонить:
скрипты в package.json будут иметь приоритет, если ничего не найдено, они будут смотреть внутрь
./node_modules/.bin/
папки.Это также выводит то, что это бежало:
Так что вам не нужно настраивать скрипты для каждой команды в вашем
package.json
.Если у вас есть сценарий, определенный
.scripts
внутри вашегоpackage.json
:yarn tsc
будет эквивалентноyarn run tsc
илиnpm run tsc
:источник
обновление: если вы на недавнем npm (версия> 5.2)
Ты можешь использовать:
npx
ищет команду в.bin
каталоге вашегоnode_modules
старый ответ:
Для Windows
Сохраните следующее в файле с именем
npm-exec.bat
и добавьте его в свой%PATH%
Применение
Тогда вы можете использовать его как
npm-exec <command> <arg0> <arg1> ...
Например
Чтобы выполнить
wdio
установленный в локальном каталоге node_modules, выполните:т.е. он будет работать
.\node_modules\.bin\wdio wdio.conf.js
источник
Я предпочитаю не полагаться на псевдонимы оболочки или другой пакет.
Добавив простую строку в
scripts
ваш разделpackage.json
, вы можете запустить локальные команды npm, такие какnpm run webpack
package.json
источник
Если вы хотите, чтобы ваша переменная PATH корректно обновлялась на основе вашего текущего рабочего каталога, добавьте это в конец вашего
.bashrc
-эквивалента (или после всего, что определяетPATH
):Это может добавить небольшую задержку каждый раз при отображении приглашения bash (скорее всего, в зависимости от размера вашего проекта), поэтому по умолчанию оно отключено.
Вы можете включить и отключить его в своем терминале, запустив
node-mode
иnode-mode-off
, соответственно.источник
Я всегда использовал тот же подход, что и @guneysus, чтобы решить эту проблему: создать скрипт в файле package.json и использовать его, запустив npm run script-name.
Тем не менее, в последние месяцы я использую npx, и мне это нравится.
Например, я скачал проект Angular и не хотел устанавливать Angular CLI глобально. Итак, с установленным npx, вместо использования глобальной угловой команды cli (если я ее установил), вот так:
Я могу сделать это из консоли:
Вот статья, которую я написал о NPX, и это углубляется в это.
источник
zxc похож на "bundle exec" для nodejs. Это похоже на использование
PATH=$(npm bin):$PATH
:источник
То же решение @regular, но вкус рыбных раковин
источник
Вы также можете использовать direnv и изменять переменную $ PATH только в вашей рабочей папке.
источник
Добавьте этот скрипт в свой
.bashrc
. Тогда вы можете позвонитьcoffee
или что-нибудь на месте. Это удобно для вашего ноутбука, но не используйте его на своем сервере.примечание : этот скрипт создает псевдоним
cd
команды, а после каждого его вызоваcd
проверяетnode_modules/.bin
и добавляет его в свой$PATH
.примечание 2 : вы можете изменить третью строку на
NODE_MODULES=$(npm bin);
. Но это сделало быcd
команду слишком медленной.источник
$(npm bin)
вместо жесткого кодирования./node_modules/.bin
.$(npm bin)
кажется, слишком медленно, чтобы использовать с каждойcd
командой. Я восстановил код и добавил примечание для него.Для Windows используйте это:
источник
Я столкнулся с той же проблемой, и мне не особо нравятся псевдонимы (как это обычно ), и если они вам тоже не нравятся, вот еще один обходной путь, который я использую, сначала вы должны создать крошечный исполняемый скрипт bash, говорят setenv.sh :
а затем вы можете использовать любые исполняемые файлы в вашей локальной сети,
/bin
используя эту команду:Если вы используете
scripts
в package.json, то:источник
Я хотел бы знать, является ли это небезопасной / плохой идеей, но, подумав немного, я не вижу здесь проблемы:
Модифицируя небезопасное решение Линуса, чтобы добавить его в конец, используя
npm bin
для поиска каталог, и заставляя скрипт вызывать толькоnpm bin
когдаpackage.json
присутствует родительский элемент (для скорости), вот для чего я придумалzsh
:Поскольку
bash
вместо использованияprecmd
ловушки вы можете использовать$PROMPT_COMMAND
переменную (я не проверял это, но вы поняли идею):источник
npm bin
в конец$PATH
может не выполнить то, что ожидает пользователь: в основном другой исполняемый файл, но, скорее всего, глобально установленный пакет с другой версией!Я
Windows
пользователь и вот что у меня сработало:Удачи.
источник
Если вы используете
fish shell
и не хотите добавлять в$path
целях безопасности. Мы можем добавить функцию ниже для запуска исполняемых файлов локального узла.Теперь вы можете запустить вещь как:
n coffee
или больше аргументов, таких как:
n browser-sync --version
Обратите внимание, что если вы
bash
пользователь, то @ Bob9630 ответы - это способ использовать bash$@
, который недоступен вfishshell
.источник
Включите coffee-script в package.json с конкретной версией, необходимой для каждого проекта, как правило, так:
Затем запустите npm install, чтобы установить зависимости в каждом проекте. Это установит указанную версию coffee-script, которая будет доступна локально для каждого проекта.
источник
npm install svgo
так же, как иnpm install
с package.json. Оба метода установлены «успешно», но команда «svgo» по-прежнему недоступна.grunt-cli
пакет глобально, затем в каталоге вашего проекта установите любую (измененную) версиюgrunt
пакета, затем при запускеgrunt
он будет использовать эту локальную версию.