Open2

node.js, npm, yarn, n 導入メモ

問題

まず Node.js を入れたいが, Node.js は n で管理したい。ただし n は npm パッケージなのでストレートに考えるとインストールに npmyarn が必要。「Node.js が先か, n が先か」という鶏卵問題にぶつかる。

解決策

検索するといくつか出てくる。

apt で入れて purge が楽そうだが今回はせっかくなので公式に従ってやってみる。

n のインストール

Readme によれば npm が使えない場合のインストール方法は以下:

curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n
bash n lts
# Now node and npm are available
npm install -g n

ただしこの少し上に注意点があるので気をつける。

The n command downloads and installs to /usr/local by default, but you may override this location by defining N_PREFIX. n caches Node.js versions in subdirectory n/versions. The active Node.js version is installed in subdirectories bin, include, lib, and share.

To avoid requiring sudo for n and npm global installs, it is suggested you either install to your home directory using N_PREFIX, or take ownership of the system directories:

要約すると以下:

  • n はデフォルトでは /usr/local に Node.js をインストールする
  • N_PREFIX を定義すればインストール先を変更できる
  • global install すると nnpmsudo 権限が必要になるので, N_PREFIX を使ってホームディレクトリにインストールするか, /usr/local/bin などのシステムディレクトリの所有者になれば良い

システムディレクトリの所有者や権限を書き換えたくはないので, ホームディレクトリにインストールすることにする。


N_PREFIX をどこに書くか迷ったが, https://qiita.com/magicant/items/d3bb7ea1192e63fba850 およびその参照記事などをもとに, .profile に書くことにした。主な理由は以下:

  • 自分の環境では .bashrc.profile のみがホームディレクトリにあった
  • 実行シェルを変えるかもしれないので bash 固有の .bash_profile をわざわざ作って書くより .profile に書けば良いかなと思った

PATH も通しておくので追記部分は以下のようにした (Readme に参考がある):

.profile
# CUSTOMIZATION
# n: for local install
export N_PREFIX="$HOME/.n"
export PATH="$N_PREFIX/bin:$PATH"

ログインし直すなり source .profile するなりし, echo $N_PREFIX で反映を確認してから手順実行。

kangetsu@ubuntu20:~$ bash n lts
  installing : node-v16.13.0
       mkdir : /home/kangetsu/.n/n/versions/node/16.13.0
       fetch : https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-arm64.tar.xz
   installed : v16.13.0 (with npm 8.1.0)
kangetsu@ubuntu20:~$ node --version
v16.13.0
kangetsu@ubuntu20:~$ which node
/home/kangetsu/.n/bin/node
kangetsu@ubuntu20:~$ which npm
/home/kangetsu/.n/bin/npm
kangetsu@ubuntu20:~$

無事グローバルにインストールされることなく Node.js LTS が入った。

次は npm install -g n の実行で, -g するか少し迷ったが, 開発用パッケージでもなくグローバルに使うかもしれないのでそのまま実行した。

kangetsu@ubuntu20:~$ npm install -g n

added 1 package, and audited 2 packages in 530ms

found 0 vulnerabilities
npm notice
npm notice New patch version of npm available! 8.1.0 -> 8.1.4
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.1.4
npm notice Run npm install -g npm@8.1.4 to update!
npm notice
kangetsu@ubuntu20:~$

これで完了......と思ったら, nN_PREFIX で指定していたパスに保存された。

kangetsu@ubuntu20:~$ which n
/home/kangetsu/.n/bin/n
kangetsu@ubuntu20:~$

想定通りではない結果になったが, このユーザー以外で開発することはないはずなので問題なし。

メモ

  • 当初の意図: n をグローバルに置いてどのユーザーにでも使えるようにする一方, 個々の Node.js はグローバルに入れない
  • 実際の結果: Node.js は想定通りだが n 自体も指定したホームディレクトリ以下に入った

よく考えたら個人開発で複数ユーザーで n や Node.js を使いたいことはないだろうから, メインユーザーが使えるのでよしとする。
当初の意図を達成するには, 素直に apt で Node.js を入れて n を入れて, apt で入れた Node.js を削除, が良かったのかもしれない。 (未検証)

$HOME/.n 以下の npm を使ったので, -g を付けても /usr/local などの「グローバル」なディレクトリに入らなかったのだろうか。n で入れた npm にとっての グローバル空間が N_PREFIX で指定したものになっている様子。

ログインするとコメントできます