node_modules にローカルにインストールされたパッケージを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com//questions/9679932

質問

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

npm install coffee-script

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

を追加できることはわかっています -g フラグを設定してグローバルにインストールすると、コーヒーはどこでも正常に動作しますが、プロジェクトごとに異なるバージョンのコーヒーを使用したい場合はどうすればよいでしょうか?

役に立ちましたか?

解決

アップデート:Seyon 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

他のヒント

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

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

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

例えば

$ $(npm bin)/bower install

使用 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 が機能すれば素晴らしいでしょう。

使用 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

アップデート: 前述のセキュリティ上の理由と、特に新しい方法の両方の理由から、この方法はもう推奨しません。 npm bin 指示。以下の元の回答:

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

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

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

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

これらの問題を回避するために、関数を作成してそれを使用しました。環境を変更する必要はなく、使い方も簡単です。

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

これは、環境を変更せずに次のように使用できます。

npm-exec r.js <args>

npm を維持したい場合は、 npx 必要なことをすべきです。


Yarn (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

アップデート:最近の 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

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

単純な行を追加すると、 scripts あなたのセクション package.json, 、次のようなローカルの npm コマンドを実行できます。

npm run webpack

パッケージ.json

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

現在の作業ディレクトリに基づいて 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, 、 それぞれ。

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

ただし、ここ数か月間私が使用しているのは、 npx そして私はそれが大好きです。

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

ng serve

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

npx ng serve

ここに記事があります NPX についてはさらに詳しく書きました。

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

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

同じ @regulator の受け入れられたソリューションですが、魚の殻の風味

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end

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

$ cat .envrc
> export PATH=$(npm bin):$PATH

このスクリプトを .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 コマンドが遅すぎます。

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

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version

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

これが安全ではない、または悪いアイデアなのかどうか知りたいのですが、少し考えてみたところ、ここには問題がありません。

Linus の安全でないソリューションを変更して最後に追加します。 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"

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

幸運を。

ご使用の場合 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.

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top