如何更改节点搜索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.`));
}
我不确定我问的问题是否正确,但我在 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.`));
}