13 May, 2017

node_modules/.binのcmdファイルについて

npmでインストールしたコマンドが"node_modules/.bin"ディレクトリにcmdファイルで生成される。そのcmdファイルのソースを読んで理解する。

cmdファイルのソースコード(eslintの場合)

今回はeslintのcmdファイルを読むが、他のコマンドも同様の形式なので1つ理解すれば問題ない。 以下がソースコードになる。

@IF EXIST "%~dp0\node.exe" (                           // (1)
  "%~dp0\node.exe"  "%~dp0\..\eslint\bin\eslint.js" %* // (2)
) ELSE (
  @SETLOCAL                                            // (3)
  @SET PATHEXT=%PATHEXT:;.JS;=;%                       // (4)
  node  "%~dp0\..\eslint\bin\eslint.js" %*
)

TL;DR

cmdファイル全体では, (1) cmdファイルのディレクトリにnode.exeが存在するか => する: node.exeでeslint実行 => しない: js拡張子もの含めたパスでnodeコマンドにより、eslint実行

(1)の部分

%~dp0はcmdファイル内で使用できる変数で、「実行されているファイルディレクトリのパス」を表す

(2)の部分

%*はコマンドに続く任意数の引数を表す。 つまり、(2)はnodejsでeslint.jsを実行しており、cmdファイルの引数を全て渡している。

(3)の部分

Starts localization of environment variables in a batch file. Localization continues until a matching endlocal command is encountered or the end of the batch file is reached.

@SETLOCALはcmdファイル内でのみ有効な環境変数を定義できるようになる宣言になる。 @ENDLOCALが呼ばれるまでの間の@SETで設定された設定はcmdファイル内のみ有効になる。

(4)の部分

PathExt environment variable returns a list of the file extensions that the operating system considers to be executable. When executing a command line that does not contain an extension, the command interpreter (cmd.exe) uses the value of this environment variable to determine which extensions to look for and in what order.

環境変数PATHEXTはWindowsが実行可能と判断するファイル拡張子リストである。 (4)ではPATHEXTに拡張子がJSのファイルを追加している。

参考

author r-tamura
r-tamura
Web関連多めのソフトウェアエンジニアです。