2014-06-06 60 views
1

我創建與node.js的運行外部腳本一個命令行接口的node.js需要在虛擬機腳本模塊

> myapp build "path/to/script.js" 

MyApp的是一個應用程序的node.js執行作爲一個命令傳遞的腳本論據。
爲了使事情變得簡單,它基本上是:

var fs = require("fs"); // this works 
var date = require("./date.js"); // supposed to load "path/to/date.js" but fails 

我的問題是require()沒有按」:

var vm = require("vm"); 
var fs = require("fs"); 

var code = fs.readFileSync(scriptPath, { encoding: "utf8" }); // read "path/to/script.js" 
var script = vm.createScript(code, scriptPath); 
var context = vm.createContext({ require: require }); 

script.runInNewContext(context); 

的 「路徑/到/的script.js」 看起來像這樣的內容t在外部腳本中正常工作。它適用於像「fs」這樣的「本地」模塊,但對本地文件失敗,可能是因爲它不知道在哪裏查找模塊。

我認爲簡單地使用下面的代碼:

require(scriptPath); 

但我不能注入自己的腳本環境。

我可以寫我自己的require功能模仿內置的要求,但在開始尋找scriptPath的模塊,但似乎有點乏味......

+0

var myLib = require(「./ myfile.js」); – dandavis

+0

@dandavis如何,即使是遠程幫助... – Bart

+0

我沒有看到你通過要求。我不知道這甚至是可能的。可能會嘗試使用{require:require.bind(this)}作爲上下文,但您可能還需要設置過程以及... – dandavis

回答

2

我用sandboxed-module來解決類似的問題。

var Sandbox = require('./sandboxed-module') 
Sandbox.require(scriptPath); 

Sandbox.require從磁盤加載代碼並在新的上下文中運行它。它提供了一個沙盒特定require函數,它允許您調整require的工作方式。

+0

謝謝,我應該想到在NPM中搜索自己。我選擇了沙盒模塊所依賴的'require-like'模塊,並且更接近我正在尋找的模塊。 – Bart

+0

謝謝你,'要求'救了我。 – AlexG