如何更改节点搜索package.json的路径?

How to change the path where node search for package.json?

我不确定我问的问题是否正确,但我在 JavaScript 中有方案解释器 我在 运行 中 Node.js,我有类似的文件这个:

我的解释器可执行文件:

#!/usr/bin/env node

它只是执行(它是代码的一部分,运行只是评估方案代码):

// parse return options and props and in _ array free args
const options = parse_options(process.argv.slice(2));
if (options.c) {
    boostrap().then(function() {
        run(options.c, env).then(print);
    });
} else if (options._.length === 1) {
   fs.readFile(options._[0], function(err, data) {
        if (err) {
            console.error(err);
        } else {
            boostrap().then(function() {
                // ignore shebang
                return run(data.toString().replace(/^#!.*\n/, ''), env);
            });
        }
    });
}

我的方案代码在/home/kuba/projects/jcubic/gtk-lips/run.scm

#!/home/kuba/projects/jcubic/lips/bin/lips.js

(display lips.version)
(define gi (require "node-gtk"))

这是为了测试我已经尝试在 gtk-lips 目录中安装 node-gtk 并尝试使用它。但它找不到它,所以基本上我需要的是更改节点的路径要求使用源文件的路径 run.scm 而不是我的可执行文件 lips.js,如果我在 jcubic/lips/ 它有效,我想把它放在 gtk-lips 目录中。

我尝试将路径设置为 require("/home/kuba/projects/jcubic/gtk-lips/node_modules/" + name");这是唯一的方法吗?

它有效,但这种方法的一个问题是,如果我在 gtk-lips/foo/ 中创建目录并尝试在该目录中 运行,它将找不到 node_module。

到目前为止我的代码:

if (typeof global !== 'undefined') {
    // ---------------------------------------------------------------------
    global_env.set('require', doc(function(module) {
        typecheck('require.resolve', module, 'string');
        module = module.valueOf();
        var root = process.cwd() + '/';
        if (!module.match(/^\s*\./)) { // just in case if it's "   ./"
            root += "node_modules/";
        }
        return require(root + module);
    }, `(require module)

        Function to be used inside Node.js to import the module.`));
    // ---------------------------------------------------------------------
}

我是否需要在像 Node 这样的树中首先搜索 node_module,或者是否有某种机制可以更改节点搜索包的位置?

我已经实现了反向搜索算法:

// -----------------------------------------------------------------------------
function reversseFind(dir, fn) {
    var parts = dir.split(path.sep).filter(Boolean);
    for (var i=parts.length; i--;) {
        var p = path.join('/', ...parts.slice(0, i));
        if (fn(p)) {
            return p;
        }
    }
}

// -----------------------------------------------------------------------------
function nodeModuleFind(dir) {
    return reversseFind(dir, function(dir) {
        return fs.existsSync(path.join(dir, 'node_modules'));
    });
}
// ---------------------------------------------------------------------------
if (typeof global !== 'undefined') {
    var fs = require('fs');
    var path = require('path');

   global_env.set('require', doc(function(module) {
        typecheck('require.resolve', module, 'string');
        module = module.valueOf();
        var root = process.cwd();
        if (module.match(/^\s*\./)) {
            return require(path.join(root, module));
        } else {
            var dir = nodeModuleFind(root);
            if (dir) {
                // local module
                return require(path.join(dir, "node_modules", module));
            } else {
                // global module
                return require(module);
            }
        }
    }, `(require module)

        Function to be used inside Node.js to import the module.`));
}