PowerShell v2 で動くNode.jsのバージョンマネージャを作った


これは PowerShell Advent Calendar 2018の21日目の記事です。

nvmp

clomie/nvmp: Node.js Version Manager running on Powershell v2
https://github.com/clomie/nvmp

Windows向けのPowerShell製Node.jsバージョンマネージャです。

特徴としては、

  • PowerShell v2 で動く
  • 管理者権限を必要としない
  • インターネットオプションに設定されたProxy設定を使って動作する

つまり、

  • 使っているPCがWindows7
  • $PSVersionTableを確認したら2.0だった
  • アカウントに管理者権限がないのでPowerShellエンジンをアップデートできない

という状況でも使えます。

インストール方法

READMEにある通りです。もちろんgit cloneではなく、zipをダウンロードして解凍してもOKです。
install.ps1を実行するとnvmp.cmdへのPATHが通って使えるようになります。

インストール方法
PS C:/git/nvmp> . .\install.ps1

使い方

インストールさえしてしまえば、コマンドプロンプトでも動きます。

コマンド一覧

その他のコマンドについてはヘルプを見てください。

> nvmp help
Node Version Manager by Powershell

Usage:
  nvmp help                       : Show this message
  nvmp install <version> [arch]   : Download and install the specified version of node.js.
                                    Optionally specify whether to install the "x86" or "x64" version (defaults to system arch).
  nvmp uninstall <version> [arch] : Uninstall the specified version of node.js
  nvmp use <version> [arch]       : Switch to use the specified version. Optionally specify x86/x64 architecture.
  nvmp current                    : Show current in-use version of node.js
  nvmp ls                         : List the node.js installations.
  nvmp ls-remote                  : List the installable versions

Example:
  nvmp install v10.9.0     : Install a specific version number of node.js
  nvmp install v10.9.0 x86 : Install a 32-bit version
  nvmp use v10.9.0         : Use the specific version

インストール先のディレクトリ

%USERPROFILE%\.nvmp\versionsディレクトリにダウンロードしたzipを展開します。
nvmp useコマンドで選択したバージョンに対して、%USERPROFILE%\.nvmp\currentディレクトリからジャンクションを張ることでバージョン切り替えを実現しています。

%USERPROFILE%
  `- .nvmp
       +- current [-> .\versions\v10.14.2]
       `- versions
            +- v11.4.0
            +- v10.14.2
            +- v8.14.0
            `- v6.15.1

対応しているNode.jsのバージョン

v4.5.0〜v4.9.1, v6.2.1〜

https://nodejs.org/dist/$(version)/node-$(version)-win-$(arch).zipをダウンロードする都合上、それが用意されているバージョンだけに対応しています。バージョン一覧を見ていると、2016年6月あたりからWindows向けzipファイルも配布されるようになった模様です。

元々はnode.exeを単体でダウンロードして、npmのアーカイブはgithubから別途ダウンロードする実装で、当時はもう少し古いバージョンにも対応していました。
現在はcodeload.github.comがTLS1.2以外で接続できなくなってしまい、PowerShell v2ではSystem.net.WebClientがTLS1.2に対応していないため、実装を見直した経緯があります。

さいごに

動作検証できる環境にいる限りはメンテしていくつもりです。
今後はlatestやLTSコードネームによるバージョン指定とかに対応していきたい。

また、2018年になってPowerShell Core 6.0もクロスプラットフォーム向けにリリースされたことですし、v2向けの実装は維持しつつ、最新のバージョンによる実装も試していきたいですね。