节点模块 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');
}
注:
在使用 webpack
或 pkg
等捆绑器时,使用 __dirname
可能会导致问题。一些模块允许使用 __dirname
并且总是引用使用 process.cwd()
这是程序的工作目录。
经过更多的研究,我发现了一个似乎工作正常的解决方案:
module.exports.serverPath = path.join(__dirname, 'extracted/ide.bat');
我是 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');
}
注:
在使用 webpack
或 pkg
等捆绑器时,使用 __dirname
可能会导致问题。一些模块允许使用 __dirname
并且总是引用使用 process.cwd()
这是程序的工作目录。
经过更多的研究,我发现了一个似乎工作正常的解决方案:
module.exports.serverPath = path.join(__dirname, 'extracted/ide.bat');