LoginSignup
0
0

More than 1 year has passed since last update.

IPアドレスを取得するnpmコマンドを作る(npm linkで自分用npmパッケージを使う)

Posted at

対象

  • ワンライナーでIPアドレスを取得したい人
  • 自分専用npmパッケージを作ってみたい人

手順

  1. 任意の場所にmyipフォルダを作る
  2. その中でnpm init -yしてpackage.jsonを作る
  3. package.jsonに以下の項目を追加する
    ./package.json
    "bin": {
        "myip": "index.js"
    }
    
  4. ./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(''));
    
  5. npm linkを実行する
  6. myipをコマンドのように実行すると、ipが表示されます:laughing:

解説

npm linkコマンド

  • グローバルのnode_modulesフォルダの中へ、作成中の
    npmパッケージフォルダへのシンボリックリンクが作成されるなど、
    グローバルインストール(npm -g i)するのと同じ効果が得られます。

  • また、他のパッケージでnpm link linkしたパッケージを実行すると、
    ローカルインストールするのと同じ効果が得られます。

  • 本来は主に作成中の動作確認が目的ですが、今回はこの仕組みを利用します。

package.jsonbinセクション

  • 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パッケージへの興味が深まればうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0