节点全局模块获取当前运行目录

时间:2017-03-26 09:10:16

标签: node.js npm npm-install

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

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

我的全局安装模块如何知道它的运行位置?举个例子,我正在尝试阅读我所在目录中的package.json文件。它正在阅读package.json的{​​{1}}文件

我试过了:

/usr/local/bin/my-module/package.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 ./的目录,其中另一个npm项目是,并运行/Users/me/Projects/different-project,我得到{ {1}}。当我退出my-module时,我得到的node_modules does not exist我希望看到的是currentDir

1 个答案:

答案 0 :(得分:0)

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

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

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

我可以看到一些评论已经提到了这一点。也许我误解了这个问题?我刚刚遇到一个案例,我需要一个全局模块来获取我正在运行脚本的目录,而我上面的建议非常有效。