我有一个使用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")
答案 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")
});