假设你的目标是实现一个绿色软件,所有的配置文件都在应用的根目录下,启动的时候读取。 这个事情要在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的影响。