正在运行的节点斌脚本时确定的命令行工作目录(Determine command line worki

2019-06-27 17:27发布

我创建一个节点的命令行界面。 这是全球范围内安装并使用bin文件来执行。

我计划有一个命令行窗口,在我的工作,然后只需运行命令,但是我一直无法确定当前工作目录中的文件的根目录下打开process.cwd()的返回节点包的目录。 我最初认为,因为正在使用批处理文件作为一个包装(那是多么的bin文件可以在开头没有节点执行),那么它是不可能的,但咖啡脚本管理做执行的代码。 我接过一看咖啡脚本来源,但无法追踪(没有足够的经验)。

为了测试它为自己创建这个文件的package.json包:

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

在此斌测试包文件:

#!/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 /测试中的命令行目录。

Answer 1:

  • process.cwd()如果它尚未被应用的内改变,以通过“process.chdir”返回,其中命令已经执行目录(不是节点包的目录)。
  • __filename返回到文件中,这样放置绝对路径。
  • __dirname返回目录的绝对路径__filename

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

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

代替

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

require(lib + '/test');

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



Answer 2:

当前工作目录

为了得到当前工作目录,你可以使用:

process.cwd()

但是,要知道,有些脚本,特别是大口喝,将改变当前的工作目录与process.chdir()

节点模块路径

您可以获取当前模块的路径:

  • __filename
  • __dirname

原目录(其中已启动的命令)

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

process.env.INIT_CWD

原来的目录,与NPM脚本工作时

它有时需要在当前目录运行脚本故宫,而不是项目的根。

此变量可用NPM包脚本,里面:

$INIT_CWD.

您必须运行一个最近的NPM的版本。 如果这个变量是不可用,确保NPM是最新的。

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

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


Answer 3:

另外,如果你想只获得当前脚本的NodeJS的当前目录,你可以尝试一些简单的像这样。 请注意,这将不会在节点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);


Answer 4:

path.resolve('.')也是一个可靠和清洁的选择,因为我们几乎总是require('path') 它会给你从那里它被称为目录的绝对路径。



文章来源: Determine command line working directory when running node bin script