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

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

要亲自测试,请使用此软件包创建一个软件包.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');

有人能解释一下吗.

然后try 在lib/test中获取命令行目录.

推荐答案

  • process.cwd()返回执行命令的目录(不是 node 包的目录),如果"进程"未更改该目录.应用程序内部的chdir.
  • __filename返回文件放置位置的绝对路径.
  • __dirname返回__filename目录的绝对路径.

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

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

而不是

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

require(lib + '/test');

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

Node.js相关问答推荐

使用Google Cloud控制台时,onCall方法在云功能中失败

MongoDB:更新批量操作中许多不能正常工作的内容

在Node.js下使用PostgreSQL客户端聚合PostgreSQL中的用户定义类型

FindOne()返回所有值,而不是一个值

FireStore事务似乎已允许并发编辑?

如何从基于JSON的HTML/SCSS模板生成PDF?

填充函数在Node.js和MongoDB中不起作用

为什么我的过滤器无法在我在下面编写的 Google Analytics 4 应用程序脚本代码中工作?我该如何修复它?

使用 axios 和 Cheerio (Node js) 抓取 google 搜索

$not 的聚合版本是什么?

node-gyp: "..\src\binding.cc: 没有这样的文件或目录"

BrowserRouter 无法渲染组件

用户与mongoose 的完美搭配

Mongoose,如何一次更新多个?

配额超出了每分钟的 Sheets API 写入请求数. node .js

使用 $in 查询时,如何获取 mongoDB 中每个唯一 ID 的 n 个文档?

使用restify时如何支持cors

nodejs:Ajax 与 Socket.IO,优缺点

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?

Node.js - 判断是否安装了模块而不实际需要它