运行节点 bin 脚本时确定命令行工作目录

我正在创建一个节点命令行界面。它是全局安装的,使用 bin 文件执行。

我计划在我正在处理的文件的根目录中打开一个命令窗口,然后运行命令,但是我无法确定当前的工作目录,因为 process.cwd()正在返回 node 包的目录。我最初假设,由于代码是使用一个批处理文件作为包装器执行的(这就是 bin 文件在开始执行时没有节点的情况) ,因此这是不可能的,但 coffee-script 设法做到了这一点。我看了一下咖啡脚本的来源,但是不能跟上它(没有足够的经验)。

为了自己测试它,用 package.json 文件创建一个包:

{
"name": "test-package",
"version": "1.0.0",
"bin": {
"test-package":  "./bin/test-package"
},
"main": "/lib/test"
}

在 bin 中的测试包文件:

#!/usr/bin/env node


var path = require('path');
var fs   = require('fs');
var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');


require(lib + '/test');

有人能解释一下吗。

然后尝试获取 lib/test 中的命令行目录。

135265 次浏览
  • 如果应用程序内部的 process.chdir 没有更改命令,则 process.cwd()返回执行命令的目录(而不是节点包的目录)。
  • __filename返回放置文件的绝对路径。
  • 返回到 __filename目录的绝对路径。

如果需要从模块目录加载文件,则需要使用相对路径。

require('../lib/test');

而不是

var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');


require(lib + '/test');

它总是相对于它从哪里调用的文件,而不依赖于当前的工作目录。

或者,如果你只想获得当前 NodeJS 脚本的工作目录,你可以试试这样简单的方法。请注意,这在 Node CLI 本身中不起作用:

var fs = require('fs'),
path = require('path');


var dirString = path.dirname(fs.realpathSync(__filename));


// output example: "/Users/jb/workspace/abtest"
console.log('directory to start walking...', dirString);

目前的工作目录

要获取当前的工作目录,你可以使用:

process.cwd()

然而,请注意,一些脚本,特别是 gup,将改变目前的工作目录与 process.chdir()

节点模块路径

您可以使用以下命令获取当前模块的路径:

  • __filename
  • __dirname

原始目录(启动命令的位置)

如果您正在从命令行运行脚本,并且您希望从其中运行脚本的原始目录中运行脚本,无论脚本当前在哪个目录中运行,您都可以使用:

process.env.INIT_CWD

使用 NPM 脚本时的原始目录

有时候,在工作目录中运行一个 NPM 脚本比在项目的根目录中运行更好。

这个变量在 npm 包脚本中可用,如下所示:

$INIT_CWD.

您必须运行 NPM 的最新版本。如果该变量不可用,请确保 NPM 是最新的。

这将允许您访问 package.json 中的当前路径,例如:

scripts: {
"customScript": "gulp customScript --path $INIT_CWD"
}

path.resolve('.')也是一个可靠和干净的选择,因为我们几乎总是 require('path')。它将给出调用它的目录的绝对路径。

以下是对我有效的方法:

console.log(process.mainModule.filename);