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

Posted

技术标签:

【中文标题】electron-builder,如何设置节点环境变量【英文标题】:electron-builder, how to set node environmental variables 【发布时间】:2019-06-10 09:05:42 【问题描述】:

windows系统的node.js可以在服务器启动前设置环境,如下:

set NODE_ENV=production 

NODE_ENV 参数可以在node.jselectron by process.env.NODE_ENV 中使用。

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

electron-builder build --windows

如何设置环境变量?


更新:

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

也许你只能手动加载一个环境文件,打包时修改,或者将参数预设为dev状态。无状态时为production

【问题讨论】:

【参考方案1】:

如果您希望在运行时设置环境变量,您可以手动设置它们或使用其他工具,例如 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 下的工作方式相同:设置变量然后运行。

【讨论】:

“CLI 用法”是什么意思?我在当前目录中创建了一个electron-builder.env 文件并输入NODE_ENV=production 和builder electron,它不起作用。我尝试在electron . 工作以开始和测试节目console.log(process.env.NODE_ENV),它是未定义的。 @AlbertChen CLI (en.wikipedia.org/wiki/Command-line_interface) 表示此文件在运行时由命令electron-builder 读取,electron 不会读取。 我尝试通过electron-builder 命令构建电子,如下所示:electron-builder build --windows,但它不起作用。我需要该命令的其他参数吗? @AlbertChen 尝试将其放在源文件的根目录中,例如在文档github.com/motdotla/dotenv-expand/tree/master/test 中用作示例的这个存储库中(参见.env 在文档中直接说明。创建一个electron-builder.env 文件并将变量放入其中。 electron-builder.env 文件应位于文件夹的根目录中,即与 package.json 所在的文件夹或 electron-builder.json 所在的文件夹相同(如果您正在使用它)。当您使用命令行界面打包应用程序时,这意味着运行electron-builder 来打包文件,而不是将其用作库。但是,它不起作用。如果有人让它工作,请发表评论。【参考方案2】:

我发布这个是希望它可以帮助其他人。我有三个环境(开发、登台和生产),我希望我的 Electron 主进程知道它在哪个环境上运行。

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

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

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

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

但是,能够区分暂存环境和生产环境有点棘手。我的登台和生产环境都使用electron-builder 打包和部署,package.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 进程以进行暂存和生产的解决方案如下:

    通过命令行调用将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
    

    在我的electron.config.js 文件(electron-builder 的配置)中,使用extraMetadata 参数(docs)将变量注入我的package.json

    extraMetadata: 
        isProduction: Boolean(process.env.NODE_ENV === 'production'),
    ,
    

    然后你可以从你的 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'));
    

【讨论】:

以上是关于electron-builder,如何设置节点环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在编译时设置电子变量?

electron-builder - 只为 mac 构建,但设置为构建 mac 并获胜

当发布设置为始终时,electron-builder 不会在 GitHub 中创建发布,尽管没有错误

如何从 Electron-builder NSIS 获取选定的语言

如何增加由 electron-builder 构建的应用程序的最大内存限制?

electron-builder 生成 latest.json 而不是 latest.yml