nodebrewやめてVoltaにのりかえてみた

技術関連
clock

2021.12.24

HAYASHIDA

こんにちは、s-hayaです。

前回の投稿からなんと、3年以上も間が空いてしまいました。
うわっ…私のブログ更新頻度、低すぎ…?

今回は重い腰を上げて、Node.jsのバージョン管理ツールについてブログに綴りたいと思います。

はじめに

これまでオークンでは、Node.jsのバージョン管理にnodebrewを採用していました。
1ヶ月ほど前、自分の開発機をM1 MaxのMacBook Proに移行することになり、この機会に使用するアプリやツールを精査することにしました。
nodebrewについても精査対象となり、色々と調査した結果Voltaを試してみることにしました。
そこで今回は、Voltaを選定した理由と使用感についてご紹介しようと思います。

なぜnodebrewの利用をやめようと思ったか

nodebrewを使い始めたきっかけ

オークンでは2018年に初めてNode.jsを採用しました。
その際、macOS上での実行環境をどのように構築するか調査を行いました。
複数のプロジェクトを並行で開発することがあるので、それぞれで固有のNode.jsのバージョンを使用できないかと考えていました。
色々と調べる中で、Node.jsのバージョン管理ツールなるものが存在することを知りました。
いくつかの選択肢がある中で、nodebrewを会社標準として採用することになりました。

あまりメンテナンスされていない…?

それから約3年間、特に違和感なく使用していましたが、新しいマシンのセットアップ時にふと思いました。
nodebrewにこだわる必要なくね?」
そこで改めてnodebrewの現状について調査してみました。

公式のGitHubリポジトリを見たところ、現行バージョンのリリースが今年の4月。
その前のバージョンは2018年の9月。
なんと、nodebrewを採用した頃からほぼ更新がなかったのです。
メンテナンスの頻度が低いことになんとなく不安を覚え、のりかえを決意しました。

Voltaの選定理由

nodebrewの利用をやめるとして、次はどのツールにするのか。
のりかえ先を考える上で、他のバージョン管理ツールについて調査してみました。
いろいろ見てみましたが、個人的にはVoltaに好印象を受けたので、こちらを採用することにしました。
良さそうと感じたところを以下にまとめてみます。

公式サイトより

公式ドキュメントに、Voltaの特徴について以下のように書かれていました。

Features
- Speed ⚡
- Seamless, per-project version switching
- Cross-platform support, including Windows and all Unix shells
- Support for multiple package managers
- Stable tool installation—no reinstalling on every Node upgrade!
- Extensibility hooks for site-specific customization

この中でも特に、プロジェクトごとにシームレスにバージョンを切り替えることができ、複数のパッケージマネージャをサポートしている点に魅力を感じました。
プロジェクトごとにどのバージョン・パッケージマネージャを使うかが変わってくるので、ここを強みとして謳っているのは心強いです。

実際に使ってみて

本当にドキュメント通りなのか疑うわけではありませんが、自分の手で動かして使用感を確かめました。

Voltaのインストール

ドキュメントには、以下のインストールコマンドをUnix向けとして記載されています。

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

ですが、Voltaを調べる中でHomebrewをサポートしているとの記述を目にしたので、私はそちらでインストールしました。

$ brew install volta
$ volta -v
1.0.5

Node.jsのインストール

volta install node@16.13.1 のようにバージョンを明示的に指定することもできれば、 volta install node@16 と書くと適切なマイナーバージョンを自動でインストールしてくれます。
何も指定しない場合は最新のLTSバージョンをインストールしてくれるとのことなので、私はこちらでインストールしました。

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

$ node -v
v16.13.1

…早い!
まず、このインストールが高速!
え、もう終わったの!?って感覚でした。

複数プロジェクトで異なるバージョンのNode.js・パッケージマネージャをインストール

2つのディレクトリを用意し、それぞれをプロジェクトと見立てます。

$ mkdir project1
$ mkdir project2

作成したそれぞれのディレクトリで npm init を実行します。
package.json が生成されるので、 volta pin コマンドでバージョンを固定します。

$ cd project1
$ npm init
$ volta pin node@16.13.1
success: pinned node@16.13.1 (with npm@8.1.2) in package.json

$ volta pin yarn@1.22.1
success: pinned yarn@1.22.1 in package.json

$ cat package.json
{
  "name": "project1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "volta": {
    "node": "16.13.1",
    "yarn": "1.22.1"
  }
}
$ cd project2
$ npm init
$ volta pin node@14
success: pinned node@14.18.2 (with npm@6.14.15) in package.json

$ volta pin yarn@1.22.17
success: pinned yarn@1.22.17 in package.json

$ cat package.json
{
  "name": "project2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "volta": {
    "node": "14.18.2",
    "yarn": "1.22.17"
  }
}

package.jsonVoltaによって各バージョンが固定された旨の記載が追加されます。
Voltaがインストールされた環境で package.json にこの記載があれば、 node コマンドや npm install を実行することで、自動的に指定のNode.js・パッケージマネージャがインストールされます。
この package.json をGitHubなどのVCSで管理することにより、同じプロジェクトのメンバーはNode.jsのバージョンを意識することなく開発することができます。
これがVoltaの誇る利点であり、それ以外のバージョン管理ツールと大きく異なる点だと感じました。

プロジェクトごとにバージョンを確認してみる

以上でそれぞれのプロジェクトにおいてNode.jsとパッケージマネージャのバージョンが固定できたので、ディレクトリを移動して各バージョンを確認してみます。

$ cd project1
$ node -v
v16.13.1

$ npm -v
8.1.2

$ yarn -v
1.22.1
$ cd project2
$ node -v
v14.18.2

$ npm -v
6.14.15

$ yarn -v
1.22.17

Voltaによってバージョンが固定されているので、ディレクトリを移動するだけで指定のバージョンに自動で切り替えられます。
いい感じですね!

まとめ

今回Voltaを試してみて、導入が容易かつ想像以上に使いやすいと感じました。
このまま会社標準として採用して良いのではないかと思っています。
既存のプロジェクトについては移行作業の手間もあるので、まずは新規プロジェクトから導入していきたいですね。

それではまた。

カテゴリー

最新の記事

2023年に参加した初めてのホノルルマラソンを終えて

2024.1.5

2023年の振り返りと2024年の展望について

2024.1.4

会社で運動会をやったら予想以上に盛り上がった

2024.1.4

【仕事って何?】過去の自分が抱えていた疑問に対する、現在の自分からのアンサー

2023.12.25

オークン"らしい"YouTubeチャンネル運用

2023.12.25

CONTACT

お問い合わせはこちらから。