我有一个JS脚本,我使用pkg—public filename.js打包成一个可执行文件
我想从这样的文件中读取数据:
let filename = __dirname + "/data/streets_profiles.csv"
fs.createReadStream(filename)
.pipe(parse({ delimiter: ',' }))
.on('data', (r) => {
//console.log("r: ", r);
data.push(r);
})
.on('end', async () => {
//... do something
当我用节点文件名。js运行脚本时,这工作得很好在VS code powershell中,当我将脚本打包成可执行文件时,我得到了这个来自可执行文件
的错误我找到了一个解决方案,那就是将我想要读取的csv文件路径添加到package.json资产,但我希望能够在不创建另一个可执行文件的情况下更改此csv文件中的数据,并使其不被锁定在可执行文件中作为资产,而是作为一个独立的可编辑文件,可以通过exe读取,是否有任何方法我可以实现这一点或任何更好的方法来创建一个可执行文件没有这些限制?
所以经过长时间的研究,我发现打包的可执行文件位于C:/快照对我来说,所以得到__dirname
是无用的,但path.dirname(process.execPath)
解决了我的问题,因为它可以得到文件的实际位置,因此在同一目录下的文件操作被启用
我遵循了这里的建议,并使其工作。
基本上,将所有出现的__dirname
替换为process.cwd()
使其工作。
注意:简单的查找和替换是行不通的。您还需要删除任何额外的相对路径,如"../../"从所有的事件中。所以
path.join(__dirname, '../../', 'uploads')
会变成path.join(process.cwd(), 'uploads')
,
- 源代码中的所有路径必须相对于项目根目录,而不是相对于其他文件。
- 可执行文件必须从项目根目录运行。静态文件和
.env
如果放在可执行文件旁边加载就可以了。