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

时间:2012-09-02 18:10:39

标签: node.js command-line npm

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

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

要自己测试它,请使用此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中的命令行目录。

5 个答案:

答案 0 :(得分:170)

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

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

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

而不是

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

require(lib + '/test');

它始终与调用的文件有关,并且不依赖于当前的工作目录。

答案 1 :(得分:26)

当前工作目录

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

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"
}

答案 2 :(得分:4)

或者,如果您只想获取当前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);

答案 3 :(得分:1)

public DataTable Query(OdbcCommand command) { var rawData = new DataTable(); try { using (OdbcConnection connection = new OdbcConnection(connectionString)) { command.Connection = connection; connection.Open(); // Execute the DataReader and access the data. using (OdbcDataReader reader = command.ExecuteReader()) { rawData.Load(reader); } // Call Close when done reading. //reader.Close(); } return rawData; } catch (OdbcException e) { logger.Log(e, EventLogEntryType.Warning); throw e; } } 也是一种可靠且干净的选择,因为我们几乎总是path.resolve('.')。它将为您提供调用它的目录的绝对路径。

答案 4 :(得分:0)

这对我有用:

console.log(process.mainModule.filename);