node.js, npm, yarn, n 導入メモ
問題
まず Node.js を入れたいが, Node.js は n
で管理したい。ただし n
は npm パッケージなのでストレートに考えるとインストールに npm
か yarn
が必要。「Node.js が先か, n
が先か」という鶏卵問題にぶつかる。
解決策
検索するといくつか出てくる。
- Node.js を
apt
でインストールし,n
をnpm install
する。それからapt
で入れた Node.js を削除する。 - Homebrew だったら
brew install n
で入る。 -
公式 Readme にあるように
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 definingN_PREFIX
.n
caches Node.js versions in subdirectoryn/versions
. The active Node.js version is installed in subdirectoriesbin
,include
,lib
, andshare
.To avoid requiring
sudo
forn
andnpm
global installs, it is suggested you either install to your home directory usingN_PREFIX
, or take ownership of the system directories:
要約すると以下:
-
n
はデフォルトでは/usr/local
に Node.js をインストールする -
N_PREFIX
を定義すればインストール先を変更できる - global install すると
n
やnpm
にsudo
権限が必要になるので,N_PREFIX
を使ってホームディレクトリにインストールするか,/usr/local/bin
などのシステムディレクトリの所有者になれば良い
システムディレクトリの所有者や権限を書き換えたくはないので, ホームディレクトリにインストールすることにする。
N_PREFIX
をどこに書くか迷ったが, https://qiita.com/magicant/items/d3bb7ea1192e63fba850 およびその参照記事などをもとに, .profile
に書くことにした。主な理由は以下:
- 自分の環境では
.bashrc
と.profile
のみがホームディレクトリにあった - 実行シェルを変えるかもしれないので bash 固有の
.bash_profile
をわざわざ作って書くより.profile
に書けば良いかなと思った
PATH
も通しておくので追記部分は以下のようにした (Readme に参考がある):
# 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:~$
これで完了......と思ったら, n
も N_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
で指定したものになっている様子。