私たちの Jenkins/CI サーバーは、node/js プロジェクトのために 1 日に何百ものビルドを実行します。完全にクリーンなワークスペースで各ビルドを実行できるようにしたいと考えています。ただし、このnpm install
ステップには 10 分以上かかる場合があり、これは遅すぎます。npm install
代わりに、npm の依存関係は少数のビルド (全ビルドの約 1%) でのみ変更されるため、変更のたびに 1 回だけ実行したいと思いnpm-shrinkwrap.json
ます (ビルドごとに md5sum を確認してください)。シュリンクラップ ファイルが変更されていない場合は、キャッシュされたnode_modules/
ディレクトリを使用します。
この計画は、キャッシュされた をコピーすれば十分に機能しますnode_modules/
が、その操作でも最大 1 分かかる場合があります。ビルド時間をさらに最適化するために、 cached にシンボリック リンクできるようにしたいと考えてい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
。
依存関係がローカル ワークスペース (つまり、実際のディレクトリ) に存在する場合、適切なモジュールが見つかるまで、inside/path/to/workspace/node_modules/
のインスタンスは (私が思うに) 依存関係ツリーを再帰します。つまり、 を探し始めて何も見つからず、次に を調べ、適切なモジュールを見つけ、それをインポートして先に進みます。require('gulp-util')
node_modules/gulp
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 には、そのようなワークフローをサポートする何らかの方法が必要ですよね? 明らかな何かが欠けていますか?ドキュメンテーションで何かを詳しく説明しましたか?