首页 文章

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

提问于
浏览
91

我正在创建一个节点命令行界面 . 它全局安装并使用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中的命令行目录 .

4 回答

  • 158

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

    当前工作目录

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

    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"
    }
    
  • 18
    • process.cwd() 如果's has not been changed by ' process.chdir'在应用程序内部,则返回执行命令的目录(不是节点包的目录) .

    • __filename 返回放置文件的绝对路径 .

    • __dirname 返回 __filename 目录的绝对路径 .

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

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

    代替

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

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

  • 0

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

相关问题