前の関連記事: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.8underscore 1.6.0が2つ、underscore 1.7.0が1つ、jsdocパッケージに入っています。
この階層構造はそれぞれのnode_modulesフォルダの階層構造と一致しており、それぞれのパッケージのnode_modulesフォルダの中をみるとunderscoreフォルダがそれぞれありました。
つまりこれらは一つのマシンに重複してインストールされています。
dedupe | npm Documentation
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に切り替えてパッケージの構成をみていみます。
node v6.0.0と同様にdedupeされています。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
でも依存関係のグラフが異なっています。
どのパッケージが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.8node 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
確かに一つの関数だけではパッケージとは言い難いですがデータベースで検索できるのは初学者には便利ではあります。
0 件のコメント:
コメントを投稿