記事一覧に戻る

nvmでLinuxに最新版のNode.jsをインストールする方法

はじめに

LinuxでNode.jsをsudo apt install nodejsのようにインストールすると、ディストリビューションによってはかなり古いバージョンが入ってしまいます。

以前、Ubuntuでnpmのnパッケージを使って指定のバージョンのNode.jsをインストール方法を、【WSL2】Ubuntuで最新版のNode.jsをインストールする方法で紹介しました。

このページは不思議と被リンクが多く、同じように困っている方が多いのかな、と勝手に感じています。なので、前回はnパッケージを使う方法を紹介しましたが、今回は一番メジャーと思われる、nvmを使ってインストールする方法を紹介したいと思います。

npmのドキュメントでも、Node.jsをインストールする際には何らかのバージョン・マネージャーを使うことが推奨されています。この中に、nvmだけでなくnもバージョン・マネージャーの例として名前が上げられていますので、決して「nだとダメ」という訳ではありません。「一番メジャーだと思う」というのは、インターネット上の情報が多い、という単純な私の個人的な感想です。

nvmとは

nvmは、Node Version Managerの略で、コマンドラインのNode.jsのバージョン管理ツールです。名前の通りですね。

nvmを使うと、バージョンを指定してNode.jsをインストールすることができます。また、バージョンの切り替えも可能なため、複数のバージョンを扱うことができます。npmのバージョンも、よしなに切り替えてくれます。

Linux含むUnix系のOSや、MacやWSL(Windows Subsystem for Linux)なら利用することができます。残念ながら、Windowsでは一部の機能しか動かないようです。

環境

私の環境は、WindowsのWSL2上でUbuntu 22.04.1 LTSを動かしています。

私の場合、既に以下のNode.jsがインストールされている状態で進めます。もちろん、入っていない状態でも問題ありません。

> node -v
v18.16.0

> npm v
9.5.1

グローバルにインストールしていたパッケージです。

> npm list -g
/usr/local/lib
├── corepack@0.17.0
├── n@9.0.1
└── npm@9.5.1

nvmのインストール

以下のコマンドを実行すると、インストール用のスクリプトがダウンロードされ、実行されます。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash

curlが使えない感興なら、以下のコマンドでも大丈夫です。

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash

curlで実行してみました。実行結果の一部を抜粋します。

/usr/local/lib
├── corepack@0.17.0
├── n@9.0.1
=> If you wish to uninstall them at a later point (or re-install them under your
=> `nvm` Nodes), you can remove them from the system Node as follows:

     $ nvm use system
     $ npm uninstall -g a_module

=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

もともとグローバルにインストールしていたnpmパッケージをアンインストールしたい場合、nvm use systemと打ってからアンインストールすることと、nvmを使うためには再度ターミナルを開きなおすか、最後の三行のスクリプトを実行する必要があることが読み取れます。

ターミナルを開きなおし、インストールのテスト用スクリプトを実行します。「nvm」と返ってくればOKです、

> command -v nvm
nvm

大丈夫ですね。

なお、公式ドキュメントによると、「nvmはバイナリの実行ファイルではなくshell関数なので、which nvm -vとコマンドを打っても確認できないよ」とのことです。

使い方

それでは使っていきましょう!

インストール可能なバージョンの一覧表示

バージョン指定に悩むようなら、インストール可能なバージョンの一覧を表示してみましょう。

nvm ls-remote

いっぱい出るので一部だけ結果をコピペします。

       v18.12.0   (LTS: Hydrogen)
       v18.12.1   (LTS: Hydrogen)
       v18.13.0   (LTS: Hydrogen)
       v18.14.0   (LTS: Hydrogen)
       v18.14.1   (LTS: Hydrogen)
       v18.14.2   (LTS: Hydrogen)
       v18.15.0   (LTS: Hydrogen)
       v18.16.0   (LTS: Hydrogen)
       v18.16.1   (LTS: Hydrogen)
       v18.17.0   (LTS: Hydrogen)
       v18.17.1   (Latest LTS: Hydrogen)
        v19.0.0
        v19.0.1
        v19.1.0
        v19.2.0
        v19.3.0

Node.jsのインストール

コマンドはnvm install バージョンです。バージョンは、14のようにマイナー版を省略することもできますし、14.2のように指定することもできます。また、直近のLTS(Long Time Support)ならnvm install --ltsのように、オプションで指定することも可能です。

Node.jsのLTSとNode.js v12.2を入れてみます。2023年9月現在、LTSはNode v18です。

nvm install --lts

こんな感じで結果が返ってきました。

Checksums matched!
Now using node v18.17.1 (npm v9.6.7)
Creating default alias: default -> lts/* (-> v18.17.1)

Node.jsとバージョンを確認してみます。上と同じ結果ですね。

> node --version
v18.17.1

> npm --version
9.6.7

次に、古いですがv14.2を入れてみます。

nvm install 14.2

ふむ。

Computing checksum with sha256sum
Checksums matched!
Now using node v14.2.0 (npm v6.14.4)

バージョンも一致していますね。

> node --version
v14.2.0

> npm --version
6.14.4

インストールしたバージョンの表示

以下のコマンドでインストールしたバージョンの一覧が見られます。

nvm ls

いっぱい表示されていますが、上の3つ以外はあまり気にしなくて良いと思います。さきほどインストールしたv14.2.0とLTSであるv18.17.1が確認できます。右矢印がついているv14.2.0が現在選択されているバージョンです。

systemは、nvmを入れる前にインストールされていたNode.jsのバージョンです。

->     v14.2.0
       v18.17.1
       system
default -> lts/* (-> v18.17.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v18.17.1) (default)
stable -> 18.17 (-> v18.17.1) (default)
lts/* -> lts/hydrogen (-> v18.17.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.17.1

バージョンの切替

現在はv14.2.0が選択されている状態です。v18.7.1に切り替えてみようと思います。コマンドはnvm use バージョンです。ここでも、マイナー版は省略できます。

nvm use 18

切替えたとメッセージが出ました。

> nvm use 18
Now using node v18.17.1 (npm v9.6.7)

v18.17.1に矢印がついています。大丈夫そうですね!

> nvm ls
        v14.2.0
->      v18.17.1
        system

もともと入っていたNode.jsへの切替

nvm use systemで、nvmインストール前に入っていたNode.jsに切り替えることができます。

> nvm use system
Now using system version of node: v18.16.0 (npm v9.5.1)

もともと入っていたv18.16.0に切り替わりました。

試しに、もともとグローバルにインストールしていたパッケージを見てみると、ちゃんとありました。

> npm list -g

/usr/local/lib
├── corepack@0.17.0
├── n@9.0.1
└── npm@9.5.1

アンインストール

さすがにv14は古いので、アンインストールします。コマンドはnvm uninstall バージョンです。マイナー版は省略できます。

nvm uninstall 14

アンインストールされました。

Uninstalled node v14.2.0
> nvm ls
->      v18.17.1
        system

nvmのメリット

ここで、1つnと比べた場合のメリットを上げようと思います。人によっては結構大きいかもしれません。

nvmで入れたLTS(v18.17.1)のインストール先と、もともと入っていたsystem(v18.16.0)のインストール先を比べてみます。ちなみに、nvm which バージョンでインストール先の確認ができます。

> nvm which 18
/home/username/.nvm/versions/node/v18.17.1/bin/node

> nvm which system
/usr/local/bin/node

お分かりいただけただろうか、、、。nvmで入れたバージョンは、ログインユーザのディレクトリ傘下にインストールされています。一方、もともと入っていたsystemは、全ユーザが利用できるように、一般ユーザでは書き込みが出来ないディレクトリにインストールされています。

つまり、nvmで入れたバージョンなら、特権ユーザでなくてもnpmパッケージをグローバル・インストールすることが出来るのです。

実際に、それぞれ一般ユーザの権限でtypescriptをグローバル・インストールして試してみます。

もともと入っていたNode.js (system)

> nvm use system
Now using system version of node: v18.16.0 (npm v9.5.1)

> npm i -g typescript
npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /usr/local/lib/node_modules/typescript
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/typescript'
npm ERR!  [Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/typescript'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'mkdir',
npm ERR!   path: '/usr/local/lib/node_modules/typescript'
npm ERR! }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/crypto/.npm/_logs/2023-09-04T14_35_09_293Z-debug-0.log

インストール先の/usr/local/lib/node_modulesに書き込み権限がないのでエラーになってしまいます。sudoで特権ユーザとして実行しないとインストール出来ません。

nvmで入れたlts (v18.17.1)

> nvm use 18
Now using node v18.17.1 (npm v9.6.7)

> npm i -g typescript

changed 1 package in 2s

> npm list -g
/home/username/.nvm/versions/node/v18.17.1/lib
├── corepack@0.18.0
├── npm@9.6.7
└── typescript@5.2.2

入った、、、!

/home/usernameは書き込み権限があるからですね。

nパッケージも、複数バージョンを入れて切り替えることは出来ますが、npmパッケージをグローバル・インストールするときにはsudoで実行する必要があります(厳密には、特定のフォルダに書き込み権限を付与すれば可能なようです)。

これは大きなメリットと言えるのではないでしょうか!?ユーザ名とパスワード無しでインストールできるので、スクリプト化も簡単にできそうです。

最後に

nvmのインストール方法と簡単な使い方を紹介しました。

nも使い方は簡単でしたが、nvmも簡単ですね。特権ユーザでなくてもnpmパッケージをグローバル・インストールが出来るのは良いですね~~。

とはいえ、本番環境のUbuntuはもうnで管理しているので、しばらくはそのままにしておくつもりです。WSL2のUbuntuで少し慣れたら、移行を検討してみたいと思います。

参考

記事一覧に戻る