2012-03-20 9 views
2

ノード・コード/モジュールをvm.createScript/scriptを使用してノード・アプリケーション(サンドボックス内)で実行する必要がある.runInNewContext。ホストノードのアプリケーションはheroku上で動作するので、話すローカルファイルシステムはありません。私は外部の依存関係のないコードをダウンロードして実行できますが、他のノードモジュールも含めることができます。 (ビルド/パッケージングのステップが理想的です)node.jsモジュール/ソースを1つの.jsファイルに結合して内部ノードを実行する方法

近づく多くの既存のソリューション(browserifyは私が最も多くの時間を費やしたものです)がありますが、それらは不可避的にコードの単一の塊を生成します!)、ブラウザ(ブー!)で実行することを意味します。例えば、Browserifyはウィンドウなどに依存関係を生成します。

package.jsonの依存関係{}を読んだり(ソース内のすべてのrequire()を参照する)ノードのrunInNewContextに適したモノリシックなBLOB?

答えて

1

あなたが探しているソリューションは適切なソリューションではないと思います。基本的にはrequire('lib')の束をつかみ、それらをひとつのJavascriptコンテキストにまとめて、そのコンテキストをソースコードにシリアライズし、そのシリアライズされたフォームをrunInNewContext関数に渡して、Javascriptコンテキストにデシリアライズして再構築し、 、サンドボックス化されたコードを実行し、最後にすべてを実行します。

必要なrequire('lib')を含むコンテキストオブジェクトを作成し、そのオブジェクトをVMに直接渡すだけでは意味がありませんか? documentationからのコードに基づいて:

var vm = require('vm'), 
initSandbox = { 
    async: require('async'), 
    http: require('http') 
}, 
context = vm.createContext(initSandbox); 
vm.runInContext("async.forEach([0, 1, 2], function(element) { console.log(element); });", context); 

今、あなたは高価なシリアライズ/デシリアライゼーションのプロセスを経ることなく、コンテキストを介してアクセスに必要なライブラリを持っています。

+0

これは、私がHerokuに書き込み可能なファイルシステムの問題がないところです。このパッケージはS3を経由してアプリケーションに入ってきています。私は.zipを歩いて、メインファイルをメモリに展開し、それをコンテキストに投げかけています。 ./tmp(一時的に書き込み可能)にインクルードされたモジュール(コアモジュールではない)を抽出し、NODE_PATH変数をrequire()のために表示することができますが、エラーが発生しやすいようです。また、後のコードパスまでrequire()に遭遇しなければ、.zip内のモジュールは長くなくなります。これが、単一のファイルにコンパイルするのが理想的だと思われる理由です。 –

+0

パッケージを動的にインストールしようとしているのはなぜですか?あなたのVMスクリプトの1つが必要な場合、それはあなたのアプリケーションの依存関係でなければならず、Herokuはそれをインストールする必要があります。たとえば、10人の異なるユーザーがすべて重複するパッケージのセットを必要とする場合はどうなりますか?それらのうちのいくつかをメモリに10回ロードしますか?このアプローチは非常に壊れやすく、スケーラブルではないようです。 –

+0

これは非常にユニークなノードのアプリケーションです。 (そしておそらく正解は!herokuです)(または!ノード..しかしそれはそうでなければ非常に望ましいプラットフォームです)それは、アプリケーションが配備されるときには予期されない、制御された開発者モジュールのセットを処理する必要があります。管理インターフェースから自由に出入りすることができる必要があります。そうであれば、重複したパッケージがメモリに残っていることは間違いありません。少なくともパッケージツールが更新されるまで、更新されたモジュールリストは基本スラッグに含まれています。 –

関連する問題