【问题标题】:Node global module getting current run directory节点全局模块获取当前运行目录
【发布时间】:2021-04-09 08:26:43
【问题描述】:

我正在尝试创建一个能够使用npm install -g mymodulename 全局安装的节点模块。如果我在模块目录中运行node index.js,模块中的所有内容都可以正常工作,但现在我想制作它以便可以将其发布到 NPM,并且可以从任何目录安装和运行它。

我的模块中有一些代码查看运行它的目录中的某些文件。我发现当我执行npm install -g ./ 然后进入另一个目录进行测试时,然后运行@987654325 @,它正在读取的相对路径来自我的模块安装位置(即/usr/local/bin/my-module),而不是我运行它的目录。

全局安装的模块如何知道它是从哪里运行的?举个例子,我正在尝试读取我所在目录中的package.json文件。它正在读取/usr/local/bin/my-module/package.jsonpackage.json文件

我试过了:

__dirname
process.args[1]
process.cwd()

直接拨打require('./package.json'),这些都不起作用。

编辑这里是index.js 中的一些代码:

#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var currentDir = path.dirname(require.main.filename);
fs.exists(`${currentDir}/node_modules`, function(dir) {
  if (!dir) throw 'node_modules does not exist';
  // do stuff
});

在我的package.json

...
"bin": {
  "my-module": "./index.js"
},
...

我尝试在项目目录中执行 npm install -g ./,然后我 cd 进入另一个名为 /Users/me/Projects/different-project 的不同目录,另一个 npm 项目所在的目录,并运行 my-module,我得到 node_modules does not exist。当我注销currentDir 时,我得到/usr/local/lib/node_modules/my-module 我期望看到/Users/me/Projects/different-project

【问题讨论】:

  • 是的,这些方法没有权利按照你想要的方式工作,因为它们会找到你当前运行脚本的目录,也就是那个模块。你试过了:var path = require('path'); var appDir = path.dirname(require.main.filename);?我认为这应该返回应用程序的入口点。
  • 当我退出 appDir 时,它显示的是 /usr/local/lib/node_modules/my-module,而不是它正在执行的目录:/
  • process.cwd() 应该可以工作。这是一个几乎与您正在尝试做的事情完全相同的示例(授予不同的文件名):github.com/TechnologyAdvice/DevLab/blob/master/src/…
  • 非常有帮助的问题,来自@Fluidbyte 的回答 - 我对你的另一个回答表示感谢 ;-)

标签: node.js npm npm-install


【解决方案1】:

您是否尝试过在文件路径的开头使用./?这应该会给你当前的工作目录(或者调用process.cwd() 也可以)。

在您的情况下,您的代码如下所示:

fs.exists(`./node_modules`, function(dir) {
  if (!dir) throw 'node_modules does not exist';
  // do stuff
});

我可以看到一些 cmets 已经提到了这一点。也许我误解了这个问题?我只是有一个案例,我需要一个全局模块来获取我正在从中运行脚本的目录,而我上面的建议就像一个魅力。

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多