2016-04-05 9 views
0

私たちの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 

しかし、単にキャッシュのパスにシンボリックリンクする依存性が依存ツリーの複数のレベルで存在する場合には動作しません。一例として、トップレベルのプロジェクトはgulpgulp-utilの両方に依存しています。最上位の依存関係は、gulp-utilにも依存します。 npm installの後、gulp-utilが最上位レベルnode_modules/にインストールされますが、node_modules/gulp/node_modulesにはインストールされません。

依存関係がローカルワークスペース(すなわち、実際のディレクトリ/path/to/workspace/node_modules/)に存在する場合、それは適切なgulp-utilモジュールが見つかるまで、その後、node_modules/gulprequire('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には、このようなワークフローをサポートする何らかの方法が必要です。私は明白な何かを欠いていますか私はドキュメンテーションの何かをぼかしたことがありますか?

+0

node_modules構造を 'node_modules/parent/node_modules/child'から' node_modules/child'に変更するNPM 3.xに切り替えることで、これを実行できます。 – Katana314

+0

ええと、私は最新バージョンのnpm 3.xで試してみましたが、まったく同じ問題がありました。 – laffoyb

+0

@laffoybこの答えを確認するhttp://stackoverflow.com/a/18974546/1341008 要するに、すべてのモジュールをNODE_PATHに入れてみてください。 –

答えて

2

@ amol-m-kulkarni here(上記の@dogo-rodicで参考になる)の回答により、私は間違いを認識しました。

与えられたモジュールは、コアモジュール(例えば。HTTP、FSなど)でない場合は、 のNode.jsはその後node_modules、という名前のディレクトリを検索するために開始されます。

現在のディレクトリ(Node.JSの現在実行されているファイル を基準にしています)から開始して、 というフォルダ階層を上って、各レベルでnode_modulesフォルダを確認します。一度 ノード。JSはnode_modulesフォルダを見つけたら、与えられたモジュールを(.js)JavaScriptファイルまたは名前付き サブディレクトリのいずれかとして をロードしようとします。指定されたサブディレクトリが見つかると、 はさまざまな方法でファイルをロードしようとします。したがって、たとえば

私の間違いは私がキャッシュパスを与えた名前でした。 /path/to/cacheと命名されたので、requireは、最後のnode_modulesディレクトリの後に上向きに見えなくなりました。この場合、それは/path/to/cache/gulp/node_modulesで停止し、/path/to/cache/gulp-utilが検索で考慮されていたはずであることを認識しませんでした。

キャッシュの名前を/path/to/cache/node_modulesに変更したので、requireはそのレベルに達するまで検索を続行し、その後は/path/to/cache/node_modules/gulp-utilとなります。

私はこれが私にはっきりしているかどうかを確認するために再度ドキュメントを参照します。

+1

私は同じ問題があります。キャッシュフォルダーの下にnode_modulesフォルダーを作成した後、それは動作します。どうもありがとう!!! –

関連する問題