Как изменить путь, по которому узел ищет пакет. json? - PullRequest
0 голосов
/ 01 апреля 2020

Я не уверен, что задаю правильный вопрос, но у меня есть интерпретатор схемы в 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"))

это для тестирования. Я попытался установить node-gtk в каталоге gtk-lips и попробовать его использовать. Но он не может его найти, поэтому в основном мне нужно изменить путь к узлу, чтобы использовать путь к исходному файлу run.scm, а не к моим исполняемым губам. js, если я установил node-gtk в jcubic / lips / он работает, я хочу, чтобы он был в каталоге gtk-lips.

Я попытался установить путь к require("/home/kuba/projects/jcubic/gtk-lips/node_modules/" + name"); это единственный способ?

Это работает, но одна из проблем этого подхода в том, что он не найдет node_module, если я создам каталог в gtk-lips / foo / и попытаюсь запустить в этом каталоге.

Мой код на данный момент:

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, или есть какой-то механизм, в котором вы могли бы изменить место поиска пакетов для узлов?

1 Ответ

0 голосов
/ 05 апреля 2020

Я реализовал алгоритм обратного поиска:

// -----------------------------------------------------------------------------
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.`));
}
...