通过可执行文件

时间:2020-01-02 13:28:13

标签: javascript node.js npm

我有npm模块(@jcubic/lips),该模块具有可执行文件,我想打开该模块目录中的文件。该模块已全局安装。

我想访问相对于模块中bin目录的文件../examples/helpers.lips,但是可执行文件安装在/ usr / bin / lips中,我不知道如何访问模块。

如何访问该文件或获取模块的根目录?有跨平台解决方案吗?

我的可执行文件是lisp解释器,我正在执行以下代码:

#!/usr/bin/env lips

(load "../examples/helpers.lips")

这是可以理解的,因为CWD是我从中调用脚本的目录。负载仅为fs.readFile + eval。

我的解释器是用JavaScript编写的,因此所需的工作与Node中的工作相同,并且可以在嘴唇中访问node中访问的每个函数。但是我要首先加载具有重要功能和宏的文件。将来可能会默认加载它,但首先我需要访问该模块。如果从本地安装的node_module调用或作为git repo的源调用它也可以工作,那将是很好的选择。

最近我了解到,如果添加处理程序,则可以对文本文件使用require,这是访问模块内部静态文件的唯一方法(使用require("@jcubic/lips/examples/helpers.lips")或更好的方法)。如果我找到有关此文章的文章,并尝试更新问题,将尝试使用该未记录的功能。

1 个答案:

答案 0 :(得分:0)

在Node.js文档中为modules找到了功能require.resolve的解决方案。

功能说明如下:

使用内部require()机制查找模块的位置,而不是加载模块,只需返回已解析的文件名即可。

这正是我所需要的,这是我正在使用的函数,请在评估用户代码之前运行它:

function boostrap() {
    var path;
    try {
        path = require.resolve('./examples/helpers.lips');
    } catch (e) {
        path = require.resolve('@jcubic/lips/examples/helpers.lips');
    }
    var data = fs.readFileSync(path);
    return run(data, env);
}