私たちのJenkins/CIサーバーは、node/jsプロジェクト用に数百のビルドを1日に実行します。私は完全にクリーンなワークスペースで各ビルドを実行できるようにしたいと思います。しかし、npm install
のステップは10分以上かかることがありますが、これは遅すぎます。代わりに、私たちのnpm依存関係は少数のビルド(すべてのビルドの約1%)でのみ変更されるので、npm-shrinkwrap.json
が変更される度に毎回npm install
を実行したい(すべてのビルドでmd5sumをチェックする)。 shrinkwrapファイルが変更されていない場合は、キャッシュされたnode_modules/
ディレクトリを使用します。同じサーバー上の複数のワークスペースに共有npm node_modules /を使用
このプランは、キャッシュされたをコピーすると十分ですが、その操作にも1分ほどかかることがあります。ビルド時間をさらに最適化するために、キャッシュされたnode_modules/
へのシンボリックリンクを作成したいと考えています。
ln -s /path/to/cache/ /path/to/workspace/node_modules
しかし、単にキャッシュのパスにシンボリックリンクする依存性が依存ツリーの複数のレベルで存在する場合には動作しません。一例として、トップレベルのプロジェクトはgulp
とgulp-util
の両方に依存しています。最上位の依存関係は、gulp-util
にも依存します。 npm install
の後、gulp-util
が最上位レベルnode_modules/
にインストールされますが、node_modules/gulp/node_modules
にはインストールされません。
依存関係がローカルワークスペース(すなわち、実際のディレクトリ/path/to/workspace/node_modules/
)に存在する場合、それは適切なgulp-util
モジュールが見つかるまで、その後、node_modules/gulp
内require('gulp-util')
の任意のインスタンスは、(私が思う)依存関係ツリーを再帰的になりますが。つまり、/path/to/workspace/node_modules/gulp/node_modules/gulp-util
を探し始め、何も見つからずに/path/to/workspace/node_modules/gulp-util
を探し、適切なモジュールを見つけてそれをインポートして移動します。私は、これは他のバージョンと同じことをしようとすることを前提としていますが、それが失敗した理由を私は見ることができない
module.js:339
throw err;
^
Error: Cannot find module 'gulp-util'
at Function.Module._resolveFilename (module.js:337:15)
at Function.Module._load (module.js:287:25)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Object.<anonymous> (/path/to/cache/gulp/index.js:4:15)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
:これはシンボリックリンクであるとき
しかし、私のようなエラーが発生しますgulp-util
を見つけてください。 /path/to/workspace/node_modules/gulp-util
または/path/to/cache/gulp-util
のいずれであれ、モジュールを見つけてインポートできるはずです。
モジュールgulp/node_modules/gulp-util
を手動でインストールして解決しようとしましたが、このようなエラーが数十回発生し、ビルドサーバーでこれを手動で処理することは不可能です。このタイプの依存関係を検索してインストールするためのコードを書くことは可能ですが、間違ったことをするような感じです。
npmには、このようなワークフローをサポートする何らかの方法が必要です。私は明白な何かを欠いていますか私はドキュメンテーションの何かをぼかしたことがありますか?
node_modules構造を 'node_modules/parent/node_modules/child'から' node_modules/child'に変更するNPM 3.xに切り替えることで、これを実行できます。 – Katana314
ええと、私は最新バージョンのnpm 3.xで試してみましたが、まったく同じ問題がありました。 – laffoyb
@laffoybこの答えを確認するhttp://stackoverflow.com/a/18974546/1341008 要するに、すべてのモジュールをNODE_PATHに入れてみてください。 –