4

私たちの 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 installgulp-util最上位にインストールされますが、 にはインストールされnode_modules/ませんnode_modules/gulp/node_modules

依存関係がローカル ワークスペース (つまり、実際のディレクトリ) に存在する場合、適切なモジュールが見つかるまで、inside/path/to/workspace/node_modules/のインスタンスは (私が思うに) 依存関係ツリーを再帰します。つまり、 を探し始めて何も見つからず、次に を調べ、適切なモジュールを見つけ、それをインポートして先に進みます。require('gulp-util')node_modules/gulpgulp-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 には、そのようなワークフローをサポートする何らかの方法が必要ですよね? 明らかな何かが欠けていますか?ドキュメンテーションで何かを詳しく説明しましたか?

4

1 に答える 1