Lambdaカクテル

京都在住Webエンジニアの日記です

npxようやく理解した

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という形式でローカルなコマンドを実行できる。
  • npm scriptsを使う
    • npm scriptsはローカルにインストールしたコマンドにパスが通った状態でコマンド列を指定できる。
  • npxを使う
    • 後述

npxとは

npxの役割は2つに分けられる:

  • ローカルにインストールしたnpm packageのコマンドを透過的に実行する
  • ローカルに存在しないコマンドでも一時的にダウンロードして実行する

このため,先程インストールしたcdkは以下のようにしてnpxで実行できる:

$ npx cdk # 自動的にローカルに解決される。存在しなければ自動的にダウンロードされるが,package.jsonには影響しない

まとめ

ようやくnpx理解した。バックエンドとUnixまわりをやっていたことが多くてnode.jsまわりの世界観まったくわからんことが多いので,ちょっとずつ慣れていきたい。