🥴

[OSS] npm init -w がどのように実行されるのか調べてみた

2023/01/29に公開

今回はnpm init -wについて調べてみました。
最近npm workspaceを触ることがありまして「そもそもnpm <command>ってどう実行されてるねん」と思ったのがきっかけです。
では、いきましょう。

Repository

https://github.com/npm/cli

早速読んでいく

rootにindex.jsがあります。
こちらでは、シンプルに./lib/cli.jsを読み込んでいるだけです。
https://github.com/npm/cli/blob/latest/index.js

./lib/cli.jsを見てみると実際にexecしている箇所があります。
こちらは./npm.jsを実行してるみたいです。
https://github.com/npm/cli/blob/latest/lib/cli.js#L134

npm.jsでは実行されたcommandのfileをさらに実行しています。
そろそろnpm initが見えてきましたね。
https://github.com/npm/cli/blob/latest/lib/npm.js

実際のcommands direcotryはこんな感じです。
お馴染みのinstalluninstallのファイルがありました。改めて見ると、OSSとは言えど泥臭くやってるんだなーと言うことが伺えます。
https://github.com/npm/cli/tree/latest/lib/commands

本題のinit.jsはこちら。
https://github.com/npm/cli/blob/latest/lib/commands/init.js

しかしnpm.jsで実行されていたcmdExecはここにはなくbase-commands.jsに定義されています。
https://github.com/npm/cli/blob/latest/lib/base-command.js#L106

そして、ついにworkspaceの実行部分がありました。
https://github.com/npm/cli/blob/latest/lib/base-command.js#L118

configの部分は.npmrcの部分が参照されています。なので下記のように.npmrcを書いてnpm initを実行すればデフォルトでnpm init -wが実行されます。

workspace=true

npm <command>を実際に動かす方法

やはり、コードを読むだけでは引数に何が入ってるのかどんなデータで処理されてるのかが見えにくいので今回はlocalで実際に動かしてdebugもしてみました。
方法はすごく簡単で、rootで下記のコマンドを実行するだけです。

node index.js init -w

あとは、気になるところでbrake pointを入れてデータの中身を見て追っていくだけです。

まとめ

今回はnpm init -wについて調べてみました。厳密にはコマンドが実行されるまでの処理の流れの記事にはなってしまいましたが、実行された後のコードも読んでみるとpackage.jsonがcreateされる箇所もあったりと(当たり前だろ)、いつも何気なく実行してるコマンドがどのように処理されてるのかを知る良い機会になりました。

また、debugを行うことでグッと読みやすくなるので、もし気になる処理があったら読んでみると面白いと思います。
まだまだ気になってる技術があるので調べたら記事にしてます。
閲覧ありがとうございました!

Discussion