それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

npm -g で グローバルじゃなくてユーザー空間を使う

目次

npm -g install のインストール先

npm を入れた状況や入れ方にもよるんですけど、npm って ユーザーローカルなどを使えないよね。

まぁグローバルだから、当たり前と言われれば当たり前です。

takuya@~$ npm config --global  get prefix
/usr/local

わたしのmacOS の場合は /usr/local/ でした。

Linuxで、例えばグローバルに入れている場合。

curl -L https://npmjs.org/install.sh | sudo sh

npm -g で グローバルはめんどくさいですよ

いまどき、Linux のFHSに従って /usr/lib とか /usr/local/lib にいれる必要ってある?

macOS は ユーザー空間のホームディレクトリ空間で良くないか。

npm の 設定を確認する。

現在の設定を確認するには、これを使う。

npm config --global  list

デフォルト設定を含めてすべて表示するときは、次のようにする。

npm config ls -l

このコマンドを見ると、次のようなおもしろそうな、ファイル名も見つかる。

prefix = "/usr/local"
cache = "/Users/takuya/.npm"
globalconfig = "/usr/local/etc/npmrc"
globalignorefile = "/usr/local/etc/npmignore"
init-module = "/Users/takuya/.npm-init.js"
userconfig = "/Users/takuya/.npmrc"

グローバルとローカル

npm には グローバルとローカルがあり、ローカルはフォルダごとに、グローバルはシステム全体。

システム全体をどう定義するか難しいところではあるが、「グローバル=ユーザー個人空間」と解釈して利用するほうがより現代的じゃないかなと感じた。

インストール先を変更する

npm config set prefix

インストール先を変更するとができるのでそれを使うことにする。

自分のホームディレクトリに突っ込むことにする。

わたしは、rubyのrbenv の gems を ~/.lib/ruby に突っ込んでいるので、そこを使うことにする。

npm config set prefix $( echo  ~/.lib/node )

または、先程の config ls -l の結果に見える npmrc を使って

NPM_PREFIX=$( echo  ~/.lib/node )
echo "prefix = $NPM_PREFIX" >> ~/.npmrc

などとしても良さそう。

設定した結果はこんな感じになりました。

takuya@Desktop$ npm config --global get prefix
/Users/takuya/.lib/node

変えたあとに知っておく必要があること

node コマンドが node_module をどこから探すかを知っておく必要がある。 Modules: CommonJS modules | Node.js v21.0.0 Documentation

node コマンドを起動したときに次の場所から探すようになっている。

  1. $HOME/.node_modules
  2. $HOME/.node_libraries
  3. $PREFIX/lib/node

つまり、 シンボリックリンクなどでぱぱっとやることで、npm コマンドだけでなく、 node コマンドからも簡単に変えることができる。

ln -sr  ~/.lib/node/lib/node_modules/  ~/.node_modules

グローバル・インストールを変更する利点

なぜグローバルのインストールを変えたほうがいいのでしょうか。

わたしは、sudoなどの権限管理とユーザー単位の管理が楽だからやりました。

パスワードを聞かれるのは不便だし、パーミッションの管理もめんどくさいのです。

/usr/lib のグローバルでのライブラリの共有は確かに便利だしディスクの容量節約になります。でも現代に置いてはDLL地獄にあるような、ライブラリの依存関係プロパティの地獄を味わうだけです。docker や openVZ のchrootアプローチも同じようなものです。

勘違いしそうになるポイント

~/.npm はただのキャッシュ

~/.npm にnode_modulesがたくさんあります。それを見ると~/.npmにインストールされるように見えてしまいます。しかし .npm はキャッシュでそこにファイルはそのまま使うことはないようです。これの根拠は初期設定を見るとわかりました。

初期設定が次の箇所になっていました、

prefix = "/usr/local"
cache = "/Users/takuya/.npm"

上は、私の設定場合です。設定を解釈すると、globalの npm のライブラリは /usr/local/node_modules にインストールされます。 ~/.npm はキャッシュですね。

つまり、"/Users/takuya/.npm" にあるファイルはキャッシュです。ローカルインストール時に使われるようです。 私の npm i コマンドの実行時に取得した npm をキャッシュ保存していて、ここからローカルに配置するようです。開発ディレクトリを含むローカルインストールの高速化と負荷低減のためでしょうか、

この設定を使うべきポイント

windows です Windowsで npm を使うときです。今回紹介した設定を使ってフォルダを移動させる手法は、Windowsでとても役に立つのです。

nvm は prefix を使えない。

nvm を利用しているときは、prefix を利用していると、nvm が使えないので、nvm を使おうとすると怒られます。

2019-12-02 追記

nvm のときの注意点

参考資料

2018-12-08

パスの記述を修正