你如何强制节点模块的绝对路径?

时间:2013-02-03 04:03:43

标签: javascript node.js titanium jasmine-node

我有一个使用CommonJS模块样式的Titanium项目。但是,代码使用绝对路径,以便在构建时将绝对路径沙箱化到应用程序目录。

var foo = require("/lib/module");

我想在命令行上运行一些测试并让jasmine-node工作。但是,当测试执行模块时,模块将在其require语句中具有上述绝对路径。

有没有办法隔离(可能是chroot)节点来解析到特定目录的绝对需求路径?如果是这样的话?

-- RepositoryRoot/
   |- app/
   |  \- Resources/
   |     |- app.js  # Has require("/lib/module1.js")
   |     \- lib/
   |        |- module1.js # Has require("/lib/module2.js")
   |        \- module2.js
   \- tests/
      \- module1.spec.js # Has require("../app/Resources/lib/module1")
                         # Or require("/lib/module1")

1 个答案:

答案 0 :(得分:3)

在找到解决方案后,我学到的是:对上述问题的简短回答是你不能那样做。节点将绝对路径读取为绝对路径。所以答案就是将我的路径从绝对路径改为伪绝对路径(相对)路径。以下是this blog post引用的一句话:

  

CommonJS require()的Titanium实现是buggy和   不正确支持相对路径。这代表了一个专业   尝试在项目中集成jasmine-node测试运行器时出现问题   甚至是最简单复杂的目录树。

     

该问题的可能解决方案是不使用相对路径   Titanium中的require()(但您可以在茉莉花中自由使用它们   规范贯穿节点)。我们需要使用完整的而不是相对路径   以Resources为根目录的路径。

这是通过在运行任何节点命令之前设置NODE_PATH环境变量来实现的。这样,诸如`require(“module / path”)之类的路径由节点钛解决。

有一些警告。某些模块强制需要绝对路径。在这种情况下,只要没有任何循环依赖,这将需要proxyquire来模拟绝对路径。此外,由于节点没有Titanium API,您还必须包含mockti包以模拟Titanium API。在spec_helper.js中使用它:

global.Ti = require("mockti");

proxyquire = require("proxyquire");
var myModule = proxyquire("relative/path/to/MyModule", {
    "/absolute/path/to/some/module": require("absolute/path/to/some/module")
});