假设你的目标是实现一个绿色软件,所有的配置文件都在应用的根目录下,启动的时候读取。 这个事情要在Electron下实现,还没那么容易。
主脚本目录
NodeJS中有一个global属性,可以获取当前脚本运行的目录,也就是 __dirname
。如果想要读取index.js旁边的mpv.conf,只需要
const path = require('path');
const fs = require('fs');
fs.readFile(path.resolve(__dirname, './mpv.conf'));
但是一旦这个事情和Electron的打包发布搅合在一起,就稍微不那么如意了。以使用electron-builder这个打包系统为例,打包前后的应用目录结构如下:
# 打包前
| folder
| | index.js
| | mpv.conf
# 打包后
| folder
| Your Production.exe
| | resources
| | | app
| | | | index.js
| | | | mpv.conf
原因在于,打包之前(开发的时候),每次运行electron调用的是全局安装的那个实例,无论在哪个目录下开发,都是用全局实例去打开开发目录下的index.js罢了。 但是打包之后,每个程序会嵌入一个特定的electron实例,运行时由这个实例去加载子目录下的相关文件。
这个时候问题就来了,配置文件放这么深不方便普通用户备份、修改是一方面;如果打包的时候开启了asar加密压缩格式,那么目录里只会存在一个app.asar压缩包,上述脚本实际运行的位置就跑到了某个临时目录下了。
Current Directory出来捣乱
除了 __dirname
,NodeJS中还有一个获取所谓“当前目录”的方式,也就是 process.cwd()
。然而很不幸,这个cwd是会改变的(参见上一篇文章)。Electron还提供了另一个方法 app.getAppPath()
,然而这个和process.cwd()表现相近,仍然受到了current directory的影响。