linuxBean14.04(110)Node.jsのnpm使い方メモ

Node.jsのパッケージマネージャーのnpmについて学習したことのメモです。Node.jsはlinuxBean14.04(107)nvmでnode.jsのインストールができない問題への対応で設定したnvmでバージョン管理しています。

前の関連記事:linuxBean14.04(109)SyntaxHighlighter3.0.9をビルドする:失敗の記録


パッケージのフォルダが入るnode_modulesのパス


04 - Installing npm packages locally | npm Documentation

これに書いてある定義によると、自分のモジュールからrequireで使用したいパッケージはnpm install パッケージ、でインストール(ローカルインストール)し、Terminalからコマンドラインで使い時はnpm install -g パッケージ、でインストール(グローバルインストール)します。

インストールしたパッケージはnode_modulesフォルダにパッケージ名のフォルダがみつかるはずです。

node_modulesフォルダにパッケージ名のフォルダが作られるのはグローバルインストールとローカルインストールしたとき以外に、package.jsonファイルがあるフォルダでnpm installした場合があります。

その場合はpackage.jsonファイルがあるフォルダ内にnode_modulesフォルダが作成されました。

グローバルインストールした場合のnode_modulesフォルダのパス

node_modulesフォルダのパスは、node v6.0.0だと~/.nvm/versions/node/v6.0.0/lib/node_modules、node v4.4.3だと~/.nvm/versions/node/v4.4.3/lib/node_modules、でした。

ところがnode v0.10.45だと~/.nvm/v0.10.45/lib/node_modulesでした。

しかしいずれも.nvm以下の各nodeのバージョンのlibフォルダにありました。

ローカルインストールした場合のnode_modulesフォルダのパス

nvmで選択したnodeのバージョンにかかわらず~/node_modulesでした。

とすると例えばnode v4.4.3でインストールしたパッケージがnode v6.0.0でも使えるのではないかと思いましたが、npm lsで確認するnode v4.4.3では見えるのにnode v6.0.0では見えないパッケージがありました。

ちゃんとどこかでnodeのバージョンごとに管理されているようでもありますし、そうでもないように思えました。

npm dedupeをするとnodeの他のバージョンでの変更が反映されていました。

でも依存関係のグラフの見え方がnodeのバージョンごとに違います。

パッケージを削除した場合も他のnodeのバージョンに影響します。

これらについては次にやります。

少なくともnvmを使ってnodeのバージョンを使い分けている視点からはローカルインストールしているパッケージに対して操作をすると他のnodeのバージョンに影響する可能性を考慮しておかないといけません。

package.jsonファイルがあるフォルダでnpm installした場合のnode_modulesフォルダのパス

package.jsonファイルがあるフォルダでnpm installしたときはそのフォルダにnode_modulesが作成され、そこに依存関係にあるパッケージ名のフォルダが入りました。

複数インストールされているパッケージをnpm dedupeで整理できるが、、、


例えばデフォルトでローカルインストールされているjsdocパッケージについてnpm lsで含まれているパッケージを見てみます。
pq@pq-VirtualBox:~/_tmp$ nvm use stable
Now using node v6.0.0 (npm v3.8.6)
pq@pq-VirtualBox:~/_tmp$ npm ls
/home/pq
└─┬ jsdoc@3.3.2
  ├── async@0.9.2
  ├─┬ catharsis@0.8.7
  │ └─┬ underscore-contrib@0.3.0
  │   └── underscore@1.6.0
  ├── escape-string-regexp@1.0.3
  ├── esprima@1.1.0-dev-harmony
  ├── js2xmlparser@0.1.9
  ├── marked@0.3.5
  ├─┬ requizzle@0.2.1
  │ └── underscore@1.6.0
  ├── strip-json-comments@1.0.4
  ├── taffydb@2.6.2
  ├── underscore@1.7.0
  └── wrench@1.5.8
underscore 1.6.0が2つ、underscore 1.7.0が1つ、jsdocパッケージに入っています。

この階層構造はそれぞれのnode_modulesフォルダの階層構造と一致しており、それぞれのパッケージのnode_modulesフォルダの中をみるとunderscoreフォルダがそれぞれありました。

つまりこれらは一つのマシンに重複してインストールされています。

dedupe | npm Documentation

npmではこの重複を整理するためのコマンドが用意されています。

npm dedupe
pq@pq-VirtualBox:~/_tmp$ npm dedupe
async@0.9.2 node_modules/jsdoc/node_modules/async -> node_modules/async
escape-string-regexp@1.0.3 node_modules/jsdoc/node_modules/escape-string-regexp -> node_modules/escape-string-regexp
esprima@1.1.0-dev-harmony node_modules/jsdoc/node_modules/esprima -> node_modules/esprima
js2xmlparser@0.1.9 node_modules/jsdoc/node_modules/js2xmlparser -> node_modules/js2xmlparser
marked@0.3.5 node_modules/jsdoc/node_modules/marked -> node_modules/marked
underscore@1.6.0 node_modules/jsdoc/node_modules/requizzle/node_modules/underscore -> node_modules/requizzle/node_modules/underscore
requizzle@0.2.1 node_modules/jsdoc/node_modules/requizzle -> node_modules/requizzle
strip-json-comments@1.0.4 node_modules/jsdoc/node_modules/strip-json-comments -> node_modules/strip-json-comments
taffydb@2.6.2 node_modules/jsdoc/node_modules/taffydb -> node_modules/taffydb
underscore@1.7.0 node_modules/jsdoc/node_modules/underscore -> node_modules/underscore
underscore@1.6.0 node_modules/jsdoc/node_modules/catharsis/node_modules/underscore-contrib/node_modules/underscore -> node_modules/underscore-contrib/node_modules/underscore
underscore-contrib@0.3.0 node_modules/jsdoc/node_modules/catharsis/node_modules/underscore-contrib -> node_modules/underscore-contrib
catharsis@0.8.7 node_modules/jsdoc/node_modules/catharsis -> node_modules/catharsis
wrench@1.5.8 node_modules/jsdoc/node_modules/wrench -> node_modules/wrench
重複しているパッケージだけ整理されるのかと思ったのですがそうではなくてjsdocフォルダ以下ににあったnode_modulesフォルダ内のパッケージがすべてローカルインストールしたときにパッケージが入る~/node_modulesに移動されました。
pq@pq-VirtualBox:~/_tmp$ npm ls
/home/pq
└─┬ jsdoc@3.3.2
  ├── async@0.9.2
  ├─┬ catharsis@0.8.7
  │ └─┬ underscore-contrib@0.3.0
  │   └── underscore@1.6.0
  ├── escape-string-regexp@1.0.3
  ├── esprima@1.1.0-dev-harmony
  ├── js2xmlparser@0.1.9
  ├── marked@0.3.5
  ├─┬ requizzle@0.2.1
  │ └── underscore@1.6.0
  ├── strip-json-comments@1.0.4
  ├── taffydb@2.6.2
  ├── underscore@1.7.0
  └── wrench@1.5.8
再度npm lsしてみましたがちゃんと依存関係は維持されています。

この操作はnode v6.0.0に対して行っていますが、操作されている~/node_modulesフォルダは他のnodeのバージョンと共有しているので今度はnode v4.4.3に切り替えてパッケージの構成をみていみます。
pq@pq-VirtualBox:~/_tmp$ nvm use 4.4.3
Now using node v4.4.3 (npm v2.15.1)
pq@pq-VirtualBox:~/_tmp$ npm ls
/home/pq
├── async@0.9.2
├── catharsis@0.8.7
├── d@0.1.1
├── es5-ext@0.10.11
├── es6-iterator@2.0.0
├── es6-symbol@3.0.2
├── escape-string-regexp@1.0.3
├── esprima@1.1.0-dev-harmony
├── js2xmlparser@0.1.9
├── jsdoc@3.3.2
├── marked@0.3.5
├─┬ requizzle@0.2.1
│ └── underscore@1.6.0
├── strip-json-comments@1.0.4
├── taffydb@2.6.2
├── underscore@1.7.0
├─┬ underscore-contrib@0.3.0
│ └── underscore@1.6.0
└── wrench@1.5.8
node v6.0.0と同様にdedupeされています。

でも依存関係のグラフが異なっています。

どのパッケージがjsdocに依存される関係であったのかわからなくなりました。

ここでwrenchというパッケージを削除してみます。
pq@pq-VirtualBox:~/_tmp$ npm uninstall wrench
unbuild wrench@1.5.8
pq@pq-VirtualBox:~/_tmp$ npm ls
/home/pq
├── async@0.9.2
├── catharsis@0.8.7
├── d@0.1.1
├── es5-ext@0.10.11
├── es6-iterator@2.0.0
├── es6-symbol@3.0.2
├── escape-string-regexp@1.0.3
├── esprima@1.1.0-dev-harmony
├── js2xmlparser@0.1.9
├─┬ jsdoc@3.3.2
│ └── UNMET DEPENDENCY wrench@~1.5.8
├── marked@0.3.5
├─┬ requizzle@0.2.1
│ └── underscore@1.6.0
├── strip-json-comments@1.0.4
├── taffydb@2.6.2
├── underscore@1.7.0
└─┬ underscore-contrib@0.3.0
  └── underscore@1.6.0
内部ではちゃんと依存関係は把握されていてjsdocの依存関係が満たされていないことが表示されます。
pq@pq-VirtualBox:~/_tmp$ nvm use stable
Now using node v6.0.0 (npm v3.8.6)
pq@pq-VirtualBox:~/_tmp$ npm ls
/home/pq
└─┬ jsdoc@3.3.2
  ├── async@0.9.2
  ├─┬ catharsis@0.8.7
  │ └─┬ underscore-contrib@0.3.0
  │   └── underscore@1.6.0
  ├── escape-string-regexp@1.0.3
  ├── esprima@1.1.0-dev-harmony
  ├── js2xmlparser@0.1.9
  ├── marked@0.3.5
  ├─┬ requizzle@0.2.1
  │ └── underscore@1.6.0
  ├── strip-json-comments@1.0.4
  ├── taffydb@2.6.2
  ├── underscore@1.7.0
  └── UNMET DEPENDENCY wrench@~1.5.8
node v6.0.0に切り替えても同じ結果になります。

このようにnvmでnodeを切り替えて使う場合は、ローカルインストールでもパッケージの取り扱いに気を使うことになります。

削除したwrenchを再インストールしようと思ってバージョンを指定せずにnpm install wrenchとすると今度はwrenchの1.5.9がインストールされました。
pq@pq-VirtualBox:~/_tmp$ npm install wrench
npm WARN deprecated wrench@1.5.9: wrench.js is deprecated! You should check out fs-extra (https://github.com/jprichardson/node-fs-extra) for any operations you were using wrench for. Thanks for all the usage over the years.
/home/pq
└── wrench@1.5.9 

npm WARN enoent ENOENT: no such file or directory, open '/home/pq/package.json'
npm WARN pq No description
npm WARN pq No repository field.
npm WARN pq No README data
npm WARN pq No license field.
wrenchを読むと作者さんはもう維持する時間がとれないそうで後継者も現れずこのパッケージはたくさん使われているのにdeprecated(非推奨)になってしまっています。
pq@pq-VirtualBox:~/_tmp$ npm ls
/home/pq
├─┬ jsdoc@3.3.2
│ ├── async@0.9.2
│ ├─┬ catharsis@0.8.7
│ │ └─┬ underscore-contrib@0.3.0
│ │   └── underscore@1.6.0
│ ├── escape-string-regexp@1.0.3
│ ├── esprima@1.1.0-dev-harmony
│ ├── js2xmlparser@0.1.9
│ ├── marked@0.3.5
│ ├─┬ requizzle@0.2.1
│ │ └── underscore@1.6.0
│ ├── strip-json-comments@1.0.4
│ ├── taffydb@2.6.2
│ └── underscore@1.7.0
└── wrench@1.5.9
とりあえずjsdocの依存関係は満たされましたがwrenchのバージョンが違うせいか、jsdocとは違う枝にwrenchが表示されるようになってしまいました。

これを解消しようとしてjsdocのpackage.jsonがあるフォルダでnpm installしました。

そうするとjsdocのpackage.jsonがあるフォルダ内にnode_moduleフォルダが作成され、さらにpackage.jsonには"wrench": "~1.5.8"と書いてあるのにwrenchは1.5.9がインストールされました。

それに加えてもっとたくさんのパッケージがインストールされました。

再度npm dedupeをしても元のパッケージ構成には戻せませんでした。

npm dedupeでパッケージを整理しても他のバージョンのnodeで依存関係がわからなくなるし、返ってパッケージの相互関係がわからなくなるので、いまのところはこのnpm dedupeは控えておくつもりです。

npm searchの実行にはメモリーが最低8GBぐらい必要らしい


npmでインストールできるパッケージを検索をするにはnpm search パッケージ名 でできるはずですが、私の環境ではエラーが出てきて実行できませんでした。
pq@pq-VirtualBox:~/_tmp$ npm search node-sass
npm WARN Building the local index for the first time, please be patient
▐ ╢░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟

<--- Last few GCs --->

  693355 ms: Mark-sweep 576.7 (716.7) -> 576.7 (716.7) MB, 1253.4 / 0 ms [allocation failure] [GC in old space requested].
  695492 ms: Mark-sweep 576.7 (716.7) -> 576.7 (716.7) MB, 2136.7 / 0 ms [allocation failure] [GC in old space requested].
  697230 ms: Mark-sweep 576.7 (716.7) -> 576.7 (716.7) MB, 1738.3 / 0 ms [last resort gc].
  698477 ms: Mark-sweep 576.7 (716.7) -> 576.7 (716.7) MB, 1246.9 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x5d478695 <JS Object>
    1: parse [native json.js:~51] [pc=0x49a0a4f9] (this=0x5d475211 <a JSON with map 0x4d70aa9d>,x=0x95508081 <Very long string[166256384]>,s=0x5d4080c9 <undefined>)
    2: arguments adaptor frame: 1->2
    3: /* anonymous */ [/home/pq/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:199] [pc=0x49a9e996] (this=0x5fd0e1f9 <an Object with map 0x5d779049>,e...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
中止
node v6.0.1でも同じ結果でした。

npmコマンドの使い方を解説しているページには触れられているものが見つけられなかったのでこれは一部の環境だけで起こる問題のようです。

npm search without search-parameter runs infinitely. · Issue #6173 · npm/npm · GitHub

どうもメモリーを8GBぐらい積んでいると問題ないようです。

私が使っているHP6730bにlinuxBean14.04をインストールの2GBとかlinuxBean14.04(1)VirtualBoxにインストールの1GBでは全然ダメなわけです。

npm searchに代わってnpm-kludge-searchでパッケージを検索する


npm searchが使えなくてもhttps://www.npmjs.com/で検索すればよいのですが、メモリーが少ないマシンでも検索できるnpm-kludge-searchが紹介されていたのでそれをインストールします。

npm install -g npm-kludge-search

Terminalから実行するコマンドなのでグローバルインストールにします。
pq@pq-VirtualBox:~/_tmp$ npm install -g npm-kludge-search
/home/pq/.nvm/versions/node/v6.0.0/bin/npm-kludge-search -> /home/pq/.nvm/versions/node/v6.0.0/lib/node_modules/npm-kludge-search/bin/search-db.js

> npm-kludge-search@2.9.6 postinstall /home/pq/.nvm/versions/node/v6.0.0/lib/node_modules/npm-kludge-search
> curl -o npmdb.pft https://smikes.github.io/npm-kludge-search/npmdb.pft

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 29.8M  100 29.8M    0     0   261k      0  0:01:56  0:01:56 --:--:--  140k
/home/pq/.nvm/versions/node/v6.0.0/lib
└─┬ npm-kludge-search@2.9.6 
  ├─┬ columnify@1.5.4 
  │ ├─┬ strip-ansi@3.0.1 
  │ │ └── ansi-regex@2.0.0 
  │ └─┬ wcwidth@1.0.0 
  │   └─┬ defaults@1.0.3 
  │     └── clone@1.0.2 
  ├─┬ event-stream@3.3.2 
  │ ├── duplexer@0.1.1 
  │ ├── from@0.1.3 
  │ ├── map-stream@0.1.0 
  │ ├── pause-stream@0.0.11 
  │ ├── split@0.3.3 
  │ └── stream-combiner@0.0.4 
  ├── hoek@2.16.3 
  ├─┬ JSONStream@0.10.0 
  │ ├── jsonparse@0.0.5 
  │ └── through@2.3.8 
  ├─┬ nopt@3.0.6 
  │ └── abbrev@1.0.7 
  └─┬ pure-fts@3.2.2 
    ├── adm-zip@0.4.7 
    ├── async@0.9.2 
    ├── binary-search@1.3.0 
    ├─┬ mkdirp@0.5.1 
    │ └── minimist@0.0.8 
    └─┬ rimraf@2.5.2 
      └─┬ glob@7.0.3 
        ├─┬ inflight@1.0.4 
        │ └── wrappy@1.0.1 
        ├── inherits@2.0.1 
        ├─┬ minimatch@3.0.0 
        │ └─┬ brace-expansion@1.1.4 
        │   ├── balanced-match@0.4.1 
        │   └── concat-map@0.0.1 
        ├── once@1.3.3 
        └── path-is-absolute@1.0.0 
30MB弱あるのでインストールには2分近くかかりました。
pq@pq-VirtualBox:~/_tmp$ npm-kludge-search -h
npm-kludge-search [flags] <term> [...<terms>]

  --help             Brief help text
  --db       db      Search database <db>
  --name     name    Exact search by <name>
  --complete prefix  Show completions staring with <prefix>
  --script           Output completion shell script
  --reporter         Set reporter (slow, fast, json)
検索結果はすぐに返ってきます。
pq@pq-VirtualBox:~/_tmp$ npm-kludge-search --name node-sass
NAME      DESCRIPTION            AUTHOR            DATE       VERSION KEYWORDS      
node-sass Wrapper around libsass =am11 =andrewnez… 2015-11-12 3.4.2   css, libsass,…
Found packages: 1
--nameをつけずに検索すると全文検索になって結果がいっぱい返ってきます。

--nameは-nに省略できます。

参考にしたサイト


npm
npmのパッケージの検索もできます。

04 - Installing npm packages locally | npm Documentation
Terminalからコマンドとして実行したいときはグローバルインストールします。

フロントエンド開発の3ステップ(npmことはじめ) - Qiita
npmの使い方の解説。

npmのあまり知られてない機能 10選 - from scratch
npmの便利なコマンドが紹介されています。

npm search without search-parameter runs infinitely. · Issue #6173 · npm/npm · GitHub
npm searchは8GBぐらいメモリーがないと動かないようです。

npm-kludge-search
npm searchの代替としてインストールしました。

NPMとleft-pad : 私たちはプログラミングのやり方を忘れてしまったのか? | プログラミング | POSTD
確かに一つの関数だけではパッケージとは言い難いですがデータベースで検索できるのは初学者には便利ではあります。

次の関連記事:linuxBean14.04(111)SyntaxHighlighter3.0.9をビルドする:成功編

PR

0 件のコメント:

コメントを投稿