640

でモジュールのローカルバージョンを使用するにはどうすればよいですかnode.js。たとえば、私のアプリでは、coffee-scriptをインストールしました。

npm install coffee-script

これにより、がインストールされ./node_modules、coffeeコマンドがになり./node_modules/.bin/coffeeます。プロジェクトのメインフォルダーにいるときにこのコマンドを実行する方法はありますか?私bundle execはバンドラーに似たものを探していると思います。基本的に、プロジェクトに関わっているすべての人が使用する必要があるコーヒースクリプトのバージョンを指定したいと思います。

フラグを追加し-gてグローバルにインストールできるので、コーヒーはどこでも問題なく機能しますが、プロジェクトごとに異なるバージョンのコーヒーが必要な場合はどうなりますか?

4

24 に答える 24

680

更新: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
于 2013-03-01T12:06:03.517 に答える
528

良い例

もう操作する必要はありませ$PATHん!

npm@5.2.0から、npmには、ローカルキャッシュまたは中央キャッシュからnpxコマンドを実行できるパッケージが付属しています。node_modules/.bin

単に実行します:

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

デフォルトでは、は、またはローカルプロジェクトバイナリに存在するnpxかどうかを確認し、それを実行します。<command>$PATH

がまだ入っていないnpx <command>ときに呼び出すと、NPMレジストリからその名前のパッケージが自動的にインストールされ、呼び出されます。それが完了すると、インストールされたパッケージはグローバルのどこにも存在しないため、長期的には汚染について心配する必要はありません。オプションを提供することにより、この動作を防ぐことができます。<command>$PATH--no-install

の場合、次のコマンドを実行してパッケージを手動でnpm < 5.2.0インストールできます。npx

$ npm install -g npx
于 2017-07-18T10:59:41.750 に答える
116

コマンドを使用してnpm bin、プロジェクトのノードモジュール/binディレクトリを取得します

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

例えば

$ $(npm bin)/bower install
于 2014-12-13T01:18:55.837 に答える
84

使用する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オプションなどがある場合、またはnpmrunがscriptsブロックに追加せずに機能する場合は便利です。

于 2015-02-16T20:10:51.973 に答える
45

更新:最近の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

于 2016-08-03T23:00:09.090 に答える
43

更新:前述のセキュリティ上の理由と、少なくとも新しいnpm binコマンドの両方の理由から、この方法はお勧めしません。以下の元の答え:

ご存知のように、ローカルにインストールされたバイナリはすべてにあり./node_modules/.binます。グローバルに利用可能なバイナリではなく、常にこのディレクトリでバイナリを実行するために、存在する場合./node_modules/.binは、パスの最初に配置することをお勧めします。

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

これをに入れると~/.profile、利用可能な場合coffeeは常に./node_modules/.bin/coffee、そうでない場合/usr/local/bin/coffee(またはノードモジュールをインストールしているプレフィックス)になります。

于 2012-03-13T11:52:21.357 に答える
43

を使用しnpm-runます。

READMEから:

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
于 2016-10-28T21:20:46.050 に答える
25

npmを維持したい場合は、npxが必要なことを実行する必要があります。


ヤーンへの切り替え(Facebookによるnpmの置き換え)がオプションである場合は、次の電話をかけることができます。

 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
于 2017-08-11T10:54:04.070 に答える
23

PATHソリューションには、$(npm bin)が.profile / .bashrc / etcに配置された場合、一度評価され、パスが最初に評価されたディレクトリに永久に設定されるという問題があります。代わりに、現在のパスを変更すると、スクリプトを実行するたびに、パスが大きくなります。

これらの問題を回避するために、関数を作成して使用しました。環境を変更せず、簡単に使用できます。

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

これは、環境に変更を加えることなく、次のように使用できます。

npm-exec r.js <args>
于 2015-08-17T21:09:42.460 に答える
12

TL; DR:と一緒に使用npm execnpm@>=7ます。


他の回答で言及されたnpxコマンドは完全に書き直されておりnpm@7、デフォルトでで出荷されnode@15、にインストールできますnode@>=10。実装は、新しく導入されたコマンドと同じになりました。これは、以前のコマンドの実装npm execと似ていますが、同じではありません。npx

1つの違いは、たとえば、依存関係がまだインストールされていないときに、依存関係をダウンロードする必要があるかどうかを常にインタラクティブに要求することです(params--yesまたはで上書きすることもできます--no)。

の例を次に示しnpm execます。二重ダッシュ( )は、パラメータを実際のコマンドパラメータから--分離します。npm exec

npm exec --no -- jest --coverage

の更新された公式ドキュメントnpm execも参照してください。

于 2021-03-12T17:31:12.653 に答える
9

私はシェルエイリアスや別のパッケージに依存しないことを好みます。

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"
  }
}
于 2018-03-11T16:21:17.030 に答える
5

現在の作業ディレクトリに基づいてPATH変数を正しく更新する場合は、これを.bashrc-equivalentの最後に(または定義するものの後に)追加します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

于 2013-11-11T06:14:10.797 に答える
5

私は常に@guneysusと同じアプローチを使用してこの問題を解決しました。これは、package.jsonファイルにスクリプトを作成し、npmrunscript-nameを実行して使用することです。

ただし、ここ数か月はnpxを使用していて、気に入っています。

たとえば、Angularプロジェクトをダウンロードしましたが、AngularCLIをグローバルにインストールしたくありませんでした。したがって、npxがインストールされている場合、グローバルなangular cliコマンド(インストールした場合)を使用する代わりに、次のようになります。

ng serve

私はコンソールからこれを行うことができます:

npx ng serve

これが私がNPXについて書いた記事であり、それはさらに深く掘り下げられます。

于 2018-08-30T22:31:07.363 に答える
2

同じ@regularの受け入れられた解決策ですが、フィッシュシェルフレーバー

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end
于 2015-09-08T14:42:49.817 に答える
2

zxcは、nodejsの「バンドルexec」のようなものです。使用するのと似ていPATH=$(npm bin):$PATHます:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
于 2016-01-18T22:09:23.687 に答える
1

direnvを使用して、作業フォルダーでのみ$PATH変数を変更することもできます。

$ cat .envrc
> export PATH=$(npm bin):$PATH
于 2016-11-16T00:22:23.947 に答える
1

このスクリプトをに追加します.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

注2:3行目をに変更できますNODE_MODULES=$(npm bin);。しかし、それではcdコマンドが遅くなりすぎます。

于 2016-12-19T16:49:30.747 に答える
1

Windowsの場合、これを使用します。

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
于 2017-02-02T12:59:18.617 に答える
0

私は同じ問題に遭遇しましたが、エイリアスを使用するのは特に好きではありません(通常の提案どおり)。エイリアスも気に入らない場合は、別の回避策を使用します。最初に、実行可能な小さな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

scriptspackage.jsonで使用している場合は、次のようにします。

...,
scripts: {
    'start': './setenv.sh <command>'
}
于 2014-12-30T22:20:43.083 に答える
0

これが安全でない/悪い考えであるかどうかを知りたいのですが、少し考えた後、ここで問題は発生しません。

Linusの安全でないソリューションを変更して最後に追加し、ディレクトリを検索するために使用し、aが親に存在する場合にnpm binのみスクリプトを呼び出す(速度のため)、これは私が思いついたものです:npm binpackage.jsonzsh

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"
于 2016-07-15T01:48:32.360 に答える
0

私は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

幸運を。

于 2017-01-26T09:27:42.230 に答える
0

を使用していて、セキュリティ上の理由で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

于 2017-05-19T16:29:01.160 に答える
0

私が開発した新しいソリューションを提案します(05/2021)

lpxhttps://www.npmjs.com/package/lpxを使用

  • ローカルのnode_modules/.binフォルダーにあるバイナリを実行します
  • ワークスペースルートのnode_modules/.binにあるバイナリをワークスペースのどこからでも実行します

バイナリがローカルで見つからない場合(つまり、npxとは異なり)、lpxはパッケージをダウンロードしません。

例: ローカルtypescriptパッケージでlpx tsc -b -w実行されますtsc -b -w

于 2021-05-16T11:11:32.280 に答える
-11

通常、次のように、各プロジェクトで必要な特定のバージョンを含むcoffee-scriptをpackage.jsonに含めます。

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

次に、npm installを実行して、各プロジェクトに依存関係をインストールします。これにより、各プロジェクトからローカルにアクセスできる指定バージョンのコーヒースクリプトがインストールされます。

于 2012-03-13T07:58:00.143 に答える