Node のバージョン管理は Volta でいいかな


Volta とは

  • 数ある Node バージョン管理ツールの一つ
  • 2020年12月にVolta1.0がリリースされ、現在のバージョンは v1.1.1 で比較的新しい
  • Rust 製で早い
  • package.json の内容を読み、自動でバージョン切り替えを行う
    • node や yarn のバージョンをプロジェクト毎に固定できる
  • グローバルパッケージを安全に使うことができる


インストール

他の Node バージョン管理ツールを使っている場合は、あらかじめアンインストールしておきましょう。

公式インストーラ(*nix)

公式のインストーラでは、*nix系OSの場合以下でインストールできます。

$ curl https://get.volta.sh | bash

インストールが完了すると、初期化ファイル .bash_profile .bashrc .zshrc .profile .config/fish/config.fish に以下が追加されます。

export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"

自身でパスを追加する場合は、--skip-setup フラグを付けてインストールすることで初期化ファイルの変更をスキップできます。

$ curl https://get.volta.sh | bash -s -- --skip-setup

初期化ファイルの変更をスキップした場合には、必要な初期化ファイルを自身で編集します。


インストールが完了すれば、~/.volta/bin に以下の shim が配備されます。

  • node
  • npm
  • npx
  • yarn

shim は、API 呼び出しを透過的にインターセプトして処理を適切にリダイレクトするライブラリです。これらの shim により node などへの操作を適切なバージョンへ切り替える作りとなっています。


なお、アンインストールは以下のように .volta を削除するだけです。

$ rm -rf ~/.volta

その後、初期化ファイル .bash_profile .bashrc .zshrc .profile .config/fish/config.fish に追加されたパスの設定を削除します。


インストール後のバージョン確認は以下のようになります。

$ volta --version
1.0.5


Homebrew

Mac の場合は brew でインストールできます。

$ brew install volta

brew でのインストールではパスの追加が行われません。

以下のコマンドでパスの追加を行うことができます。

$ volta setup

自身行う場合は、必要な初期化ファイルに以下を追加します。

export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"

私の環境では、 .zshrc から .profile を読み込んでいるため、 .profile にパスの設定を追加しました。


Winget

winget が提供されているので、以下でインストールできます。

> winget add Volta.Volta

winget install でも同様です(addinstall のエイリアスです)。

なお、winget で導入した際も、開発者モードの設定などした方が良いので、続く「公式インストーラ(Windows)」の内容も参照してください。


公式インストーラ(Windows)

Windows の場合は以下からインストーラをダウンロードしてインストールします。

  • https://github.com/volta-cli/volta/releases

Volta はシンボリックリンクを使うため、Windows の開発者モードでの利用が推奨されています。

開発者モードは、「設定」-「更新とセキュリティ」のサイドメニューから「開発者向け」を選択し、「開発者モード」を ON にします。


インストーラは、システム環境変数のパスに C:\Program Files\Volta\ を追加し、ユーザ環境変数のパスに C:\Users\<user>\AppData\Local\Volta\bin を追加します。

C:\Program Files\Voltaには以下の shim が配備されます。

  • node
  • npm
  • npx
  • yarn

shim は、API 呼び出しを透過的にインターセプトして処理を適切にリダイレクトするライブラリです。これらの shim により node などへの操作を適切なバージョンへ切り替える作りとなっています。

インストール後のバージョン確認は以下のようになります。

$ volta --version
1.0.5


volta install で Node エンジンを導入する

Volta のインストールが完了したら、Volta から Node をインストールします。

最新のLTS 版の Node を導入するには以下のようにします。

$ volta install node
success: installed and set node@14.18.1 (with npm@6.14.15) as default

$ node -v
v14.18.1

install という名前ですが、このコマンドは、ツールのデフォルトバージョンを設定するコマンドです。もしツールがダウンロード済みでない場合は、フェッチを行い、続いてツールのデフォルトバージョンを設定します。

つまり、ローカルに導入済みかどうかにかかわらず install を行えば、そのバージョンが有効になる、ということです。

バージョンを指定する場合は、以下のような指定が可能です。

$ volta install node@latest
$ volta install node@16.11.1
$ volta install node@16

パッケージマネージャも同様に install できます。

$ volta install yarn
success: installed and set yarn@1.22.15 as default

$ volta install npm
success: installed and set npm@8.0.0 as default


volta list で現在のツールチェーンを一覧する

導入済みの Node ランタイム、パッケージマネージャなどを一覧するには以下のようにします。

$ volta list all

Volta で管理しているツールの一覧を以下のように確認できます。

⚡️ User toolchain:

    Node runtimes:
        v14.18.1
        v15.14.0
        v16.11.1 (default)

    Package managers:
        Yarn:
            v1.22.15 (default)

    Packages:
        typescript@4.4.4 (default)
            binary tools: tsc, tsserver
            platform:
                runtime: node@16.11.1
                package manager: npm@built-in


現在のディレクトリ(プロジェクト)に応じた、有効なNode ランタイム、パッケージマネージャを確認する場合は以下となります。

$ volta list

現在のプロジェクトで使用されるツールの一覧を確認できます。

⚡️ Currently active tools:

    Node: v16.11.1 (current @ /<path_to_project>/package.json)
    npm: v8.0.0 (default)
    Yarn: v1.22.15 (current @ /<path_to_project>/package.json)
    Tool binaries available:
        tsc, tsserver (current @ /<path_to_project>/package.json)

package.json に記載のあるバージョンが自動的に選択されます。つまり、明示的な切り替え操作が不要になります。

Node や Yarn のバージョン固定には、続く pin を使います。


volta pin でバージョンを固定する

volta pin コマンドは、選択したバージョンのツールを使用するように、現在のプロジェクトの package.json ファイルを更新します。

npm init されたプロジェクトでバージョンを固定するには以下のようにします。

$ volta pin node@16

これにより、当該プロジェクトの package.json に以下のエントリが追加されます。

"volta": {
  "node": "16.11.1",
  "yarn": "1.19.2"
}

package.json によりバージョンが固定されるため、(Voltaを使っている)チームメンバが、ことなるバージョンで作業することがなくなります。 プロジェクトのディレクトリで作業すれば、Volta が自動的に package.json の定義に従ったバージョンを選択してくれます。


コマンドラインツールのグローバルなインストール

以下のように TypeScript をグローバルにインストールした場合を考えます。

$ npm install -g typescript

Volta は、この時の Node エンジンを記憶し、ツール実行時の Node エンジンのバージョンが固定されます。

volta list all の内容で確認できます。

    Packages:
        typescript@4.4.4 (default)
            binary tools: tsc, tsserver
            platform:
                runtime: node@16.11.1
                package manager: npm@built-in


グローバルにコマンドラインツールをインストールしていても、個別のプロジェクトで npm install typescript としてインストールされたツールは、その package.json に定義されたバージョンが自動的に選択されます。

そのため、Volta はグローバルパッケージの利用を安全に行うことができます。


まとめ

Node バージョン管理ツールである Valta を紹介しました。

バージョンの切り替えを明示的に行う必要がなく、package.json の定義に従ったバージョンが自動的に選択されるため、hassle-free な管理ツールです。

特に、チームで開発している場合は、何も考えずともバージョンが固定できるため、他のバージョン管理ツールと比較して、良い選択肢だと思います。



ハンズオンNode.js

ハンズオンNode.js

Amazon