4

我有一个使用 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")
4

1 回答 1

4

在这里找到解决方案后,我学到了:对上述问题的简短回答是你不能这样做。Node 将绝对路径读取为绝对路径。所以简而言之,答案是将我的路径从绝对路径更改为伪绝对(相对)路径。这是这篇博客文章的引述,它提供了一些启示:

require()CommonJS的Titanium实现有问题,并且不能正确支持相对路径。当尝试将 jasmine-node 测试运行器集成到具有最小复杂目录树的项目中时,这代表了一个主要问题。

该问题的一个可能解决方案是不在 require()Titanium 中使用相对路径(但您可以在通过节点运行的 jasmine 规范中自由使用它们)。我们需要使用完整路径而不是相对路径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")
});
于 2013-02-05T10:57:30.207 回答