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

Dan*_*eld 109 command-line node.js npm

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

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

要自己测试它,请使用此package.json文件创建一个包:

{
  "name": "test-package",
  "version": "1.0.0",
  "bin": {
    "test-package":  "./bin/test-package"
  },
  "main": "/lib/test"
}
Run Code Online (Sandbox Code Playgroud)

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');
Run Code Online (Sandbox Code Playgroud)

任何人都可以对此有所了解.

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

Vad*_*hev 181

  • process.cwd() 返回已执行命令的目录(不是节点包的目录),如果它尚未被应用程序内的'process.chdir'更改.
  • __filename 返回放置它的文件的绝对路径.
  • __dirname返回目录的绝对路径__filename.

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

require('../lib/test');
Run Code Online (Sandbox Code Playgroud)

代替

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

require(lib + '/test');
Run Code Online (Sandbox Code Playgroud)

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

  • 在`process.chdir()`之后,有没有办法得到原文? (2认同)
  • 实际上对于 NodeJS 来说这都是一样的。即使在 Windows 上,您也可以方便地以 Unix 方式要求相对路径。所以`../lib/test`是可移植的,而Windows对应的`..\lib\test`则不是...... (2认同)

sup*_*ary 38

目前的工作目录

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

process.cwd()
Run Code Online (Sandbox Code Playgroud)

但是,请注意,某些脚本(尤其是gulp)将更改当前工作目录process.chdir().

节点模块路径

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

  • __filename
  • __dirname

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

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

process.env.INIT_CWD
Run Code Online (Sandbox Code Playgroud)

使用NPM脚本时的原始目录

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

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

$INIT_CWD.
Run Code Online (Sandbox Code Playgroud)

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

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

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}
Run Code Online (Sandbox Code Playgroud)

  • 注意,$INIT_CWD 仅适用于 Linux。对于 Windows,您必须使用 %INIT_CWD%。我认为这个问题可以通过使用 https://www.npmjs.com/package/cross-env 来克服,但我自己没有尝试过 (2认同)