対象
- ワンライナーでIPアドレスを取得したい人
- 自分専用npmパッケージを作ってみたい人
手順
- 任意の場所に
myip
フォルダを作る - その中で
npm init -y
してpackage.json
を作る -
package.json
に以下の項目を追加する./package.json"bin": { "myip": "index.js" }
-
./index.js
を作り以下を書き込む./index.js#!/usr/bin/env node console.log(Object.entries(require('os').networkInterfaces()) .map(([_, nics]) => nics).flat() .filter(nic => !nic?.internal && nic?.family === 'IPv4') .map(nic => nic?.address ?? '') .filter(ip => !ip.startsWith('169.254.')) .slice(0, 1).join(''));
-
npm link
を実行する -
myip
をコマンドのように実行すると、ipが表示されます
解説
npm link
コマンド
-
グローバルの
node_modules
フォルダの中へ、作成中の
npmパッケージフォルダへのシンボリックリンクが作成されるなど、
グローバルインストール(npm -g i
)するのと同じ効果が得られます。 -
また、他のパッケージで
npm link linkしたパッケージ
を実行すると、
ローカルインストールするのと同じ効果が得られます。 -
本来は主に作成中の動作確認が目的ですが、今回はこの仕組みを利用します。
package.json
のbin
セクション
-
npmパッケージインストールの際に
package.json
の
bin
セクションでコマンド名とファイルの紐付けがあると、
/node_modules/.bin
フォルダにコマンド名で
ファイルへのシンボリックリンクが作成されます。 -
グローバルインストール(
npm -g i
)の場合には、
(カレントバージョンの)Node.jsのbin
フォルダになります。 -
npm link
でも同じようになるため、bin
フォルダに
パスが通っていれば、コマンドとして実行可能になります。
#!/usr/bin/env node
-
このshebangにより、実行された
.js
ファイルが
nodeのプロセスを起動してjavascriptを実行できます。 -
つまりこのshebangを変えればいろいろ対応可能です。
require('os').networkInterfaces()
- Node.js標準モジュールである
os
のメソッドを使用して
NIC(Network Interface Card)の情報を取得しています。
終わりに
タイトルのかっこ内が主題になってしまいましたが、
npmパッケージへの興味が深まればうれしいです。