Closed Haramaki0326 closed 3 years ago
知らないのは損!npmに同梱されているnpxがすごい便利なコマンドだった
run-script
node_modules
node_modules/.bin/
$ npm list --depth 0 project@1.0.0 /path/to/project └── cowsay@1.4.0
$ ./node_modules/.bin/cowsay 'ほむら'
\ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
$ $(npm bin)/cowsay 'さやか'
- `npm bin`はカレントプロジェクトのローカルパッケージPATHを返してくれるコマンドです。 - さてこの問題をこれまでどうしていたかというと、npmの`run-script`というしくみを利用することが多かったのではないでしょうか。package.jsonのscriptsフィールドに実行したいコマンドを定義しておくことで、`npm run`で実行できるというものです。
$ grep -A 3 scripts package.json "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "cowsay": "cowsay" },
$ npm run cowsay -- 'マミ'
project@1.0.0 cowsay /path/to/project cowsay "マミ"
scriptsフィールドではローカルインストールしたパッケージのコマンドを直接実行できるテクニックを使用したものです。しかし"cowsay": "cowsay"のようなコマンドだけの定義が増えていくのはつらいものがありました。npxを使用することでこれらの問題から解放されます。 scriptsフィールドにコマンドのみ定義していたようなケースは、ほぼ置き換えられるのではないでしょうか。オプションや引数も込みで定義しているものは、無理に置き換える必要はありません。
$ npx mocha $ npx gulp $ npx textlint $ npx eslint $ npx tsc
## グローバルインストールせずに一度だけコマンドを実行する npxコマンドをたたくと次の順番でコマンドを探します。 1. ローカルパッケージ(node_modules/.bin) 2. 環境変数PATH 3. npmレジストリ 大事なのは3で、たとえインストールされていないコマンドであっても、自動的にnpmレジストリからパッケージを探してくれます。見つけたパッケージは環境を汚さない場所にダウンロードされます 。そのため先述した例のように、環境にコマンドが見つからなかった場合、npmレジストリから探してダウンロードし実行してくれるというわけです。このとき少し注意が必要で、npmレジストリから探すのは 指定したコマンドと同名のパッケージ です。そのため、 **パッケージ名とコマンドが異なる場合は`-p`オプションでパッケージ名を明示する必要があります。** 最近は@で始まるスコープを使用したパッケージ(Scoped packages)も増えていますので注意しましょう。
参考
知らないのは損!npmに同梱されているnpxがすごい便利なコマンドだった
概要
run-script
を使用せずにローカルインストールしたコマンドを実行するrun-script
を使用せずにローカルインストールしたコマンドを実行するnode_modules
配下にインストールされます。node_modules/.bin/
配下にコマンドが配置されます。$ ./node_modules/.bin/cowsay 'ほむら'
< ほむら >
$ $(npm bin)/cowsay 'さやか'
< さやか >
$ grep -A 3 scripts package.json "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "cowsay": "cowsay" },
$ npm run cowsay -- 'マミ'
< マミ >
$ npx mocha $ npx gulp $ npx textlint $ npx eslint $ npx tsc