Electron官方未提供判断当前程序运行环境的方法。我认为官方不提供这个方法也是说的过去的,因为Electron扮演的是应用开发框架的角色,而运行环境这些东西本身属于开发者自己的事情,有的开发者喜欢定义“开发、测试、预生产、生成”四个环境,而有的开发者却只定义了一个生产环境,这些都不是框架需要参与的事情。

本文提供了几个定义和判断程序运行环境的方法,开发者可以根据实际情况选取相应的方法。

1. app.isPackaged

Electron官方提供了app.isPackaged属性来判断应用是否是经过打包的。

app.isPackaged 的原理是判断进程名称是否为 electron 或 electron.exe,如果名称匹配(不区分大小写)则是打包环境。

通常将打包环境当作生产环境,但这并不是强制性的规则。

我们也可以自己通过代码实现判断程序进程名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function isProduction() {
if (!process.versions.electron) {
// Node.js process
return false;
}
if (process.platform === "darwin") {
return !/\/Electron\.app\//.test(process.execPath);
}
if (process.platform === "win32") {
return !/\\electron\.exe$/.test(process.execPath);
}
if (process.platform === "linux") {
return !/\/electron$/.test(process.execPath);
}
}

2. 根据命令行参数判断

通过在不同环境中为程序添加不同的启动参数,然后在运行时校验这些命令行参数来判断当前的运行环境。

在生产环境中不添加任何启动参数,因此没有启动参数的就为生产环境;如果有启动参数,再根据参数判断是否为测试或预发布等环境。

值得注意的是不同的环境添加启动参数的方式不太一样,比如开发环境不需要打包,可以通过下面方式添加:

1
electron . --env=development

而非开发环境往往需要打包,需要在命令行中手动添加,如:

1
Demo.exe --env=test

判断方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function isProduction() {
if (!process.versions.electron) {
// Node.js process
return false;
}

for (const v of process.argv) {
if (v === "--env=development" || // 开发环境
v === "--env=test" // 测试环境
) {
return false;
}
}

return true;
}

3. 通过环境变量判断

这个判断方法与方法2类似,不做过多介绍。需要注意的是,Windows和Unix上添加环境变量的方式略有不同。

Windows:

1
set APP_ENV=dev && electron .

Unix:

1
APP_ENV=dev electron .

在Electron中通过process.env.APP_ENV方式就可以获取到APP_ENV环境变量。