やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

npmでパッケージを管理する方法

グローバルだのローカルだの、結局どうすればいいの?

問題

パッケージをどこに保存するか?

モジュールの重複とバージョン差異

異なるプロジェクトで、ある同一のモジュールAを使うと、ダブった分だけファイルサイズが嵩む。

でも、各プロジェクトでいつかバージョン差異が生じるかもしれない。アップデートする/しないの判断で。それなら個別に持たせておくべき。

でも、将来どうなるかなんてわからない。どうするのが最善?

解決案

方法 長所 短所
共有 ファイルサイズ節約、変更共有 バージョン差異をプロジェクトごとに制御できない(動かなくなる可能性)
個別 プロジェクトごとに異なるバージョンを持てる ファイルサイズ肥大化(同一でも共有できずダブる)

両者のおいしい所どりをしたい。環境変数PATHやハードリンクなどを使ってうまいことできないか? $ npm linkというコマンドがあるらしいが使える? (未確認)

npmのインストール方法

グローバルとローカルの2種類ある。

種類 インストールコマンド
グローバル $ npm i -g
ローカル $ npm i

プロジェクト固有パッケージはlocalにインストールし、共通パッケージはglobalにインストールするという使い方を想定しているのか?

だが、ネット上にはGlobalよりLocalにすべきという主張がある。

方法

  1. Globalインストール
  2. Globalインストール+npm link
  3. Localインストール+環境変数PATH
  4. Localインストール

A. Globalインストール

$ npm i -gとすることで、特定パスにインストールされる。環境変数PATHも設定してくれる。

ただ、package.jsonが作成されないらしい。他の環境へ移行しづらくなってしまうとか。参考

Globalインストール+npm link

$ npm linkはローカルに実体がインストールされ、グローバルにそのシンボリックリンクが作られるらしい。(npm 5.0以降)

思っていたのと違った。まだ公開していないモジュールをそのまま公開せずローカルでテストしたいときに使うらしい。

B. Localインストール+環境変数PATH

$ npm iでカレントディレクトリ配下にインストールする。package.json, node_modules/が生成される。node_modules/.bin/環境変数PATHに通す。

だが、gulpなどはプロジェクトごとのローカルに必要らしく動かなかった。なんとかファイルサイズを節約しようと小細工したがダメっぽい。

C. Localインストール

プロジェクトごとに全部インストールする。

ファイルサイズが膨大になる。RAMディスクでやるとメモリが圧迫される。タスクランナ、ビルダ/バンドラ、トランスパイラなど、使い回しそうなSDK系すらプロジェクトごとに導入するのだから。

だが、これがナウいやり方らしい。(node_modules/だけで数十MB以上……これをプロジェクトごとに毎回……ないわ)

gulp,gulp-stylusなどを使った動作確認ができた)

C-1. Localインストール後ソースコード入替

C のプロジェクトをSDKとし、ソースコード部分だけを毎回変える。

プロジェクト 保存場所
SDKプロジェクト SDカード(ふつうにファイル保存)
個別プロジェクト RAMディスク。git push/git clone。(.gitignore "node_modules/")

RAMディスク+GitHub運用

ラズパイはSDカードが補助記憶装置だが、フラッシュメモリゆえ書込上限がある。できるだけ節約するためにRAMディスクを使いたい。だがRAMディスクはメインメモリゆえ電源を落としたら消える。そこでGitHubリモートサーバに配置することで永続化する。

SDKプロジェクトはSDカードに圧縮しておいて、新規プロジェクトを作りたくなったらRAMディスクに展開する形がいい。

個別プロジェクトはGitHubリモートサーバに保存する。作業をはじめるときはRAMディスクに$ git cloneし、終わったら$ git pushする。これでSDカードに保存せずとも、電源を落とした後でも作業を継続できる。(要ネット接続)

完成した個別プロジェクトを使うときは、SDカードに保存する。以降、ネット接続せずとも使えるようになる。保存対象はHTML,CSS,JSだけ。node_modules/は不要。(結局SDカードに書き込まれてしまうが、上記までの手順を踏めば開発途中の書込は回避できる。その部分が非常に大きいので効果は高い)