你如何强制为节点模块的绝对路径?(How do you force the absolute pat

2019-07-19 04:48发布

我有使用CommonJS的模块风格钛项目。 然而代码使用绝对路径,这样,当它建立的绝对路径是沙箱应用程序目录。

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

我想运行在命令行上一些测试,并有茉莉节点的工作。 然而,当测试执行模块,该模块将在他们的要求陈述上述绝对路径。

有没有一种方法来隔离(可能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")

Answer 1:

之后发现这里的解决方案是什么,我了解到:简短的回答确切上面的问题是,你不能这样做 。 节点读取绝对路径,绝对路径。 因此,在短期的答案是从绝对到伪绝对 (相对)路径改变我的路径。 下面是从报价这个博客帖子是带来了曙光:

CommonJS的的钛执行require()是越野车和不能正确支持相对路径。 试图茉莉节点的测试运行中的项目集成了最低限度,甚至复杂的目录树时,这是一个重大的问题。

一个可能的解决方案的问题是在不使用相对路径require()在钛(但你可以自由地使用他们在您的茉莉规格通过节点运行)。 相反,相对路径,我们需要使用具有完整路径Resources作为根目录。

这是通过设定完成NODE_PATH环境变量运行的任何节点的命令之前。 这样的路径,如`需要(“模块/路径”)是由节点钛解决。

有几个注意事项。 有些模块强制绝对路径的需要。 在这种情况下,一个需要proxyquire只要不存在任何循环依赖关系,这将工作模拟出的绝对路径。 此外,由于节点没有钛API的你还必须包括mockti包模拟出钛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")
});


文章来源: How do you force the absolute path for node modules?