目次
- 目次
- npm -g install のインストール先
- npm の 設定を確認する。
- グローバルとローカル
- インストール先を変更する
- 自分のホームディレクトリに突っ込むことにする。
- 設定した結果はこんな感じになりました。
- 変えたあとに知っておく必要があること
- グローバル・インストールを変更する利点
- 勘違いしそうになるポイント
- この設定を使うべきポイント
- nvm は prefix を使えない。
- 2019-12-02 追記
- 参考資料
- 2018-12-08
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 コマンドを起動したときに次の場所から探すようになっている。
- $HOME/.node_modules
- $HOME/.node_libraries
- $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 のときの注意点
参考資料
- https://mosapride.com/index.php/2018/02/06/post-681/
- npm - Change default global installation directory for node.js modules in Windows? - Stack Overflow
- $ npm install -g でインストールされるディレクトリを変更する #Node.js - Qiita
- ASCII.jp:いまさら聞けない!npmのこれだけは知っておきたい基礎知識
2018-12-08
パスの記述を修正