节点模块 return 可以是其文件之一的完整路径吗?

Can a node module return a full path to one of its files?

我是 Node.js 的新手,目前正在实现一个包含 zip 的节点模块。安装(安装后)后,将 zip 解压缩到模块的子文件夹中。此外,main.js 脚本为调用者提供了一种方法,该方法 return 是其中一个提取文件的完整路径。

模块的结构如下所示:

module_A
|- package.json
|- lib
|  └ postinstall.js
|- resources
|  └ ide.zip
|- extracted
|  └ ide.bat
└- main.js

到目前为止,要求似乎“简单”,但是我 运行 不知道如何 return 提取文件的完整路径。目前我的 main.js 脚本如下所示:

const path = require('path');

exports.getServerBatch = function() {
    return path.resolve('/extracted/ide.bat');
}

在另一个项目中使用该模块时...

C:\projects\myproject\
              |- package.json (includes dependency to module_A)
              |- node_modules
              |  └ module_A
              |     |-main.js
              |     |-extracted
              |         └ ide.bat
              |     ...

...并使用 VSCode 进行调试,returned 路径如下所示:

C:\Users\<my_user>\AppData\Local\Programs\Microsoft VS Code\extracted\ide.bat

而不是:

C:\projects\myproject\node_modules\module_A\extracted\ide.bat

如果我从另一个地方调用方法,路径就会改变。这让我觉得完整路径总是取决于应用程序的执行位置。

有没有办法在不使用执行路径的情况下return获取我需要的完整路径?

path.resolve() 函数相对于 process working directory 解析给定的 path,在您的情况下 C:\Users\<my_user>\AppData\Local\Programs\Microsoft VS Code 因为 vs 代码在该位置启动了程序。

有一个名为 __dirname 的全局文件,它是文件所在的文件夹。

您可以在 main.js

中尝试这个


const path = require('path');

exports.getServerBatch = function() {
    // join concacinates paths. Handy for being crossplattform. I suggest to use it 
    // always for putting paths together.
    return join(__dirname, 'extracted', 'ide.bat');
}

注:

在使用 webpackpkg 等捆绑器时,使用 __dirname 可能会导致问题。一些模块允许使用 __dirname 并且总是引用使用 process.cwd() 这是程序的工作目录。

经过更多的研究,我发现了一个似乎工作正常的解决方案:

module.exports.serverPath = path.join(__dirname, 'extracted/ide.bat');