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

问题描述 投票:0回答:1

我不确定是否要问正确的问题,但是我在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并尝试使用它。但是找不到它,所以基本上,我需要更改节点的路径,如果我在jcubic / lips /上安装了node-gtk,则需要使用源文件run.scm而不是我的可执行文件lips.js的路径可以,我想在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_module,或者是否有某种机制可以更改节点在哪里搜索软件包?

node.js require
1个回答
0
投票

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

// -----------------------------------------------------------------------------
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.`));
}
© www.soinside.com 2019 - 2024. All rights reserved.