node_modules にローカルにインストールされたパッケージを使用するにはどうすればよいですか?
-
13-12-2019 - |
質問
モジュールのローカル バージョンを使用するにはどうすればよいですか 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
他のヒント
操作する必要はありません $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 を実行して、各プロジェクトに依存関係をインストールします。これにより、指定されたバージョンのコーヒー スクリプトがインストールされ、各プロジェクトからローカルにアクセスできるようになります。