147

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

我计划在我正在处理的文件的根目录中打开一个命令窗口,然后只运行命令,但是我无法确定当前的工作目录,因为process.cwd()它正在返回节点包的目录。我最初假设由于代码是使用批处理文件作为包装器执行的(这就是 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 中的命令行目录。

4

5 回答 5

226
  • process.cwd()如果它没有被应用程序内部的“process.chdir”更改,则返回执行命令的目录(不是节点包的目录)。
  • __filename返回放置文件的绝对路径。
  • __dirname返回目录的绝对路径__filename

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

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

代替

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

require(lib + '/test');

它总是相对于它调用的文件,并且不依赖于当前的工作目录。

于 2012-09-02T20:55:03.743 回答
71

当前工作目录

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

process.cwd()

但是,请注意,某些脚本,尤其是 gulp,会使用process.chdir().

节点模块路径

您可以通过以下方式获取当前模块的路径:

  • __filename
  • __dirname

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

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

process.env.INIT_CWD

使用 NPM 脚本时的原始目录

有时需要在当前目录而不是项目的根目录中运行 NPM 脚本。

此变量在 npm 包脚本中可用:

$INIT_CWD.

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

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

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}
于 2018-04-17T10:33:58.250 回答
4

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

于 2018-10-29T19:57:03.493 回答
3

或者,如果您只想获取当前 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);
于 2014-03-18T22:28:13.437 回答
0

这对我有用:

console.log(process.mainModule.filename);
于 2020-07-22T15:23:10.847 回答