我不确定我问的问题是否正确,但我有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并尝试使用它。但它找不到它,所以基本上我需要的是更改node的路径。需要使用源文件run.scm的路径,而不是我的可执行文件lips.js的路径,如果我在jcubic/lips/上安装node gtk有效,我希望它在gtk唇形目录中。
我已经尝试将路径设置为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.`));
}