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

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

我打算在我正在处理的文件的根目录下打开一个命令窗口,然后运行命令,但是我一直无法确定当前的工作目录,因为process.cwd()正在返回节点包的目录。 我最初认为,因为代码是使用batch file作为包装来执行的(这就是bin文件如何在没有节点的情况下执行的),那么这是不可能的,但是咖啡脚本可以做到这一点。 我看了一下咖啡脚本源,但不能遵循它(没有足够的经验)。

要自己testing一下,用这个package.json文件创build一个包:

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

这个testing包文件在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中的命令行目录。

  • 如果在应用程序内部没有被'process.chdir'改变, process.cwd()将返回执行了命令的目录(不是节点包的目录)。
  • __filename返回放置文件的绝对path。
  • __dirname返回__filename目录的绝对path。

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

 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);