Haramaki0326 / StudyToDo

2021年にチャレンジ、やりたいことリスト
0 stars 0 forks source link

`npx`コマンドについて #69

Closed Haramaki0326 closed 3 years ago

Haramaki0326 commented 3 years ago

参考

知らないのは損!npmに同梱されているnpxがすごい便利なコマンドだった

概要

run-scriptを使用せずにローカルインストールしたコマンドを実行する

$ ./node_modules/.bin/cowsay 'ほむら'


< ほむら >

    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

$ $(npm bin)/cowsay 'さやか'


< さやか >

    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

- `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 "マミ"


< マミ >

    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

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)も増えていますので注意しましょう。