electron-builder,如何设置节点环境变量

electron-builder, how to set node environmental variables

Node.js在windows系统可以在服务器启动前设置环境,像这样:

set NODE_ENV=production 

NODE_ENV 参数可以被 process.env.NODE_ENVnode.jselectron 中使用。

但是当我通过 electron-builder 构建 electron 时,像这样:

electron-builder build --windows

如何设置环境变量?


更新:

可能无法通过 electron-builder 将固定环境变量传递给可执行文件。

可能只能手动加载一个环境文件,打包的时候修改,或者把参数预设成dev状态。没有状态的时候就是production.

如果您希望在 运行 时设置环境变量,您可以手动设置它们或使用其他工具,例如 dotenv https://www.npmjs.com/package/dotenv

但最简单的方法是在 运行 二进制文件 运行 时设置它们。您可以使用批处理脚本(如果 windows),例如:

setlocal
set NODE_ENV=production
.\your-binaries.exe
endlocal

注意: setlocal 防止变量进一步泄漏。

单行版可以是set NODE_ENV=production && .\binaries.exe

在 linux 下工作方式相同:设置变量然后 运行。

我发布这篇文章是希望它能帮助处于我这种情况的其他人。我有三个环境(开发、暂存和生产),我希望我的 Electron 主进程 知道它 运行 在哪个环境上。

现在,对于开发来说,使用 CLI 将环境变量内联暴露给 Electron 非常容易:

export NODE_ENV=development && electron desktop/main.js

然后,Electron 的主进程可以像这样访问这个环境变量:

const isDev = process.env.NODE_ENV === 'development';

但是,区分暂存环境和生产环境有点棘手。我的暂存和生产环境都是使用 electron-builderpackage.json 脚本打包和部署的,如下所示:

"desktop-build": "webpack --config config/webpack/webpack.prod.js && electron-builder --config config/electron.config.js",
"desktop-build-staging": "webpack --config config/webpack/webpack.staging.js && electron-builder --config config/electron.config.js",

注意:上面的 webpack 配置将配置暴露给渲染器进程(网站),而不是主进程。

因此,我将环境暴露给 Electron main 阶段和生产过程的解决方案如下:

  1. 通过命令行调用将 NODE_ENV=stagingNODE_ENV=production 设置为 electron-builder

    # Production
    export NODE_ENV=production && webpack --config config/webpack/webpack.prod.js && electron-builder --config config/electron.config.js
    
    # Staging
    export NODE_ENV=staging && webpack --config config/webpack/webpack.staging.js && electron-builder --config config/electron.config.js
    
  2. 在我的 electron.config.js 文件中(electron-builder 的配置)使用 extraMetadata 参数 (docs) 将变量注入我的 package.json:

    extraMetadata: {
        isProduction: Boolean(process.env.NODE_ENV === 'production'),
    },
    
  3. 然后您可以从 Electron 主进程访问它:

    // This variable is injected into package.json by electron-builder via the extraMetadata field (specified in electron.config.js)
    const {isProduction} = Boolean(require('./package.json'));