当前位置: 首页 > 知识库问答 >
问题:

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

曹泉
2023-03-14

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

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

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

共有3个答案

符佐
2023-03-14

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

姚棋
2023-03-14

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

process.cwd()

但是,请注意,某些脚本,特别是Gulp,会使用process.chdir()更改当前工作目录。

您可以通过以下方式获取当前模块的路径:

  • __filename
  • __dirname

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

process.env.INIT_CWD

有时最好在当前目录下运行NPM脚本,而不是在项目的根目录下。

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

$INIT_CWD.

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

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

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}
谢和同
2023-03-14
  • 过程。cwd()返回已执行命令的目录(不是节点包的目录),如果该目录未被“进程”更改。应用程序内部的chdir
  • __filename返回文件所在位置的绝对路径
  • __dirname返回_filename目录的绝对路径

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

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

而不是

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

require(lib + '/test');

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

 类似资料:
  • 问题内容: 我正在创建节点命令行界面。它是全局安装的,并使用bin文件执行。 我计划在正在处理的文件的根目录下打开一个命令窗口,然后运行命令,但是由于返回节点包的目录,我无法确定当前的工作目录。最初,我假设由于代码是使用批处理文件作为包装器执行的(这就是bin文件可以在开始时没有节点的情况下执行的方式),所以这是不可能的,但是coffee- script可以做到这一点。我看了看咖啡脚本的源代码,但

  • 我的package.json看起来像: 我想运行的js脚本app.js.我不能直接使用节点app.js运行它,因为app.js包含新的语言语法。 因此,我必须按照上面定义的启动脚本,使用NPMStart通过babel运行它。这里没有问题。 我的问题是如何在命令行中直接运行cmd,可以吗?类似的东西: npm运行babel节点——预设环境应用程序。js

  • 我如何通过命令行运行它?

  • IM 创建一个 groovy 脚本,用于从 docker 容器执行 SQL 脚本。这是我要执行的命令 当我从终端执行它时,它是有效的,但是当我调用我的groovy脚本来执行那一行时,我得到一个mysql帮助,就像命令不正确一样。 这就是我从groovy执行命令的方式: 有人知道为什么结果不一样或者为什么命令无法识别吗?

  • 我无法在NodeJS应用程序中使用< code>exec运行Conda命令。 我收到以下错误: /bin/sh: /用户/用户名/桌面/存储库/项目/XYZ: 是一个目录 命令未发现错误:您的 shell 未正确配置为使用“conda 激活”。要初始化您的 shell,请运行 目前支持的shell有:-bash-fish-tcsh-xonsh-zsh-powershell 请参阅“conda in

  • 常用的命令行参数: --testnet: connect to MOAC testnet (networkid = 101); --rpc: initiate RPC service of HTTP, so as to nonlocally access the specific MOAC node service; --rpcaddr value: default as "localhost