npmでパッケージを管理する方法
グローバルだのローカルだの、結局どうすればいいの?
問題
パッケージをどこに保存するか?
モジュールの重複とバージョン差異
異なるプロジェクトで、ある同一のモジュールAを使うと、ダブった分だけファイルサイズが嵩む。
でも、各プロジェクトでいつかバージョン差異が生じるかもしれない。アップデートする/しないの判断で。それなら個別に持たせておくべき。
でも、将来どうなるかなんてわからない。どうするのが最善?
解決案
方法 | 長所 | 短所 |
---|---|---|
共有 | ファイルサイズ節約、変更共有 | バージョン差異をプロジェクトごとに制御できない(動かなくなる可能性) |
個別 | プロジェクトごとに異なるバージョンを持てる | ファイルサイズ肥大化(同一でも共有できずダブる) |
両者のおいしい所どりをしたい。環境変数PATHやハードリンクなどを使ってうまいことできないか? $ npm link
というコマンドがあるらしいが使える? (未確認)
npmのインストール方法
グローバルとローカルの2種類ある。
種類 | インストールコマンド |
---|---|
グローバル | $ npm i -g |
ローカル | $ npm i |
プロジェクト固有パッケージはlocalにインストールし、共通パッケージはglobalにインストールするという使い方を想定しているのか?
だが、ネット上にはGlobalよりLocalにすべきという主張がある。
方法
- Globalインストール
- Globalインストール+
npm link
- Localインストール+環境変数PATH
- Localインストール
A. Globalインストール
$ npm i -g
とすることで、特定パスにインストールされる。環境変数PATHも設定してくれる。
ただ、package.json
が作成されないらしい。他の環境へ移行しづらくなってしまうとか。参考
Globalインストール+npm link
- Eq エンジニアブログ: npm link を試してみた
- https://docs.npmjs.com/cli/link
- 特定のモジュールと強く依存するプロジェクトの開発を行うときのtips(「npm link」と「dependenciesにローカルフォルダを指定する」方法の比較 ) - Qiita
$ 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カードに書き込まれてしまうが、上記までの手順を踏めば開発途中の書込は回避できる。その部分が非常に大きいので効果は高い)