如何使用环境变量构建不同的版本

Posted

技术标签:

【中文标题】如何使用环境变量构建不同的版本【英文标题】:How to build different versions with environment variables 【发布时间】:2019-05-24 02:06:03 【问题描述】:

根据this,不可能在带有环境变量的电子应用程序中设置标志。我仍然需要为 dev、staging、pilot 和 prod 构建不同版本的应用程序。

在内部我想使用electron-node-config,因为它很简单。但是因为我无法访问环境变量,所以无法使用node-config

所以我想到了几个入口脚本,比如

// index.dev.js
require('./main')( APP_URL: 'localhost:8080' );

// index.staging.js
require('./main')( APP_URL: 'https://staging.foo.com' );

// pilot.staging.js
require('./main')( APP_URL: 'https://pilot.foo.com' );

我的main.js 文件看起来或多或少像这样

module.exports = (config) => 
  app.on('ready', () => 
    mainWindow.loadURL(config.APP_URL);
  );
;

但是,在 electron builder 文档中似乎没有指定入口文件的选项,它总是使用index.js 来打包应用程序,并且文档中没有太多关于 js api 的内容除了

const builder = require('electron-builder');
const env = process.env.NODE_ENV;
const entry = `index.$env.js`;

builder.build(
  entry,
  appId: 'com.electron.foo',
  productName: 'foo',
  mac: 
    target: 'zip'
  ,
  win: 
    target: 'portable'
  ,
  portable: 
    artifactName: 'foo.exe'
  
);

所以我尝试像这样设置我的 package.json

"scripts": 
  "build:staging": "NODE_ENV=development node scripts/build",
  "build:pilot": "NODE_ENV=pilot node scripts/build",
  "build:production": "NODE_ENV=production node scripts/build"

但是我真的不确定如何设置电子构建器配置的入口文件。如何指定入口文件?

【问题讨论】:

如果您在 cmets 上明确指出 scripts/build 实际上是您的 build.js,那么对于初学者应该会很好。非常感谢这个解决方案 【参考方案1】:

我用一个 hacky bash 脚本做到了这一点

#!bin/bash

# make tmp package.json
cp package.json _package.json

# set entry file
sed -i '' "s/index.js/index.$1.js/" package.json

# set output folder
sed -i '' "s/TARGET/$1/" package.json

# package app
npm run build

# get rid of electron config package.json
rm package.json

# "reset" old package.json
mv _package.json package.json

我的 package.json 脚本看起来像


  "postinstall": "electron-builder install-app-deps",
  "reinstall": "rm -rf node_modules/ && npm i",
  "start": "NODE_ENV=development electron src/index.development.js",
  "build": "build -mw",
  "build:development": "sh scripts/build.sh development",
  "build:pilot": "sh scripts/build.sh pilot",
  "build:pilot2": "sh scripts/build.sh pilot2",
  "build:production": "sh scripts/build.sh production",
  "build:all":
    "npm run build:development && npm run build:pilot && npm run build:pilot2 && npm run build:production",
  "test": "npm run postinstall && jest"

【讨论】:

【参考方案2】:

您可以使用 electron-build config extraMetadata 解决此问题,您可以在构建过程中覆盖 package.json 属性。

const builder = require('electron-builder');
const env = process.env.NODE_ENV;
const entry = `index.$env.js`;

builder.build(
  config: 
    extraMetadata: 
      main: entry
    ,
    appId: 'com.electron.foo',
    productName: 'foo',
    mac: 
      target: 'zip'
    ,
    win: 
      target: 'portable'
    ,
    portable: 
      artifactName: 'foo.exe'
    
  
);

【讨论】:

你如何实现这个?在 package.json 中我们添加的只是构建。你如何覆盖 package.json 配置。

以上是关于如何使用环境变量构建不同的版本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Jenkins中的环境变量

如何使用 MSBuild 引用不同版本的 dll

构建 React 项目后如何设置节点环境变量(运行时)?

运行构建过程时如何配置我的 prod 环境变量?

jenkins插件之如何优雅的生成版本号

如何根据工作流变量部署到不同的环境?