npx is 何という状況がずっと続いていたけれどようやく合点がいったのでメモしておく。
npm復習
まずnpmについて実行可能なコマンドのインストールの側面からちょっと復習する。
npm install -g aws-cdk
みたいなコマンドを叩くと,aws-cdk
がグローバルにインストールされる。aws-cdkは実行可能なコマンドcdk
も提供するので,これは(僕の環境では)/usr/local/lib/node_modules/aws-cdk/bin/cdk
にインストールされる。
また/usr/local/lib/node_modules/aws-cdk/bin/
にはPATHが通されるので,どこからでもcdk
コマンドが使えるようになる。
これが通常のnpm global installの(コマンドだけに絞った)流れ。
プロジェクトローカルなコマンド
コマンドを提供するnpm packageをグローバルにインストールするとどうなるかについては先程説明した。
ではローカルにインストールするとどうなるのかというと,インストールされる先がプロジェクトローカルのnode_modules
になるだけである。
例えばnpm install aws-cdk
を実行すると,プロジェクトルートから見て./node_modules/aws-cdk/bin/cdk
にコマンドがインストールされる。
しかしながら自動的にPATHが通されるわけではないので,これを実行するにはいくつかの方法を取る必要がある。以下に示す。
- 直接実行する
./node_modules/aws-cdk/bin/cdk
と書く方法。
npm bin
を使う- $PATH指定の簡便のため,
./node_modules/.bin
には,インストールした各パッケージのbin/
以下のコマンドへのシンボリックリンクが置かれている。 npm bin
コマンドは./node_modules/.bin
への絶対パスを返す。$(npm bin)/cdk
という形式でローカルなコマンドを実行できる。
- $PATH指定の簡便のため,
- npm scriptsを使う
- npm scriptsはローカルにインストールしたコマンドにパスが通った状態でコマンド列を指定できる。
- npxを使う
- 後述
npxとは
npxの役割は2つに分けられる:
- ローカルにインストールしたnpm packageのコマンドを透過的に実行する
- ローカルに存在しないコマンドでも一時的にダウンロードして実行する
このため,先程インストールしたcdk
は以下のようにしてnpx
で実行できる:
$ npx cdk # 自動的にローカルに解決される。存在しなければ自動的にダウンロードされるが,package.jsonには影響しない
まとめ
ようやくnpx理解した。バックエンドとUnixまわりをやっていたことが多くてnode.jsまわりの世界観まったくわからんことが多いので,ちょっとずつ慣れていきたい。