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

Javascript 如何使用环境变量构建不同的版本,javascript,electron,electron-builder,Javascript,Electron,Electron Builder,据介绍,不可能在带有环境变量的electron应用程序中设置标志。我仍然需要为dev、staging、pilot和prod构建不同版本的应用程序 在内部,我想使用,因为它很简单。但由于我无法访问环境变量,因此无法使用节点配置 所以我想有几个入门脚本,比如 // index.dev.js require('./main')({ APP_URL: 'localhost:8080' }); // index.staging.js require('./main')({ APP_URL: 'https

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

在内部,我想使用,因为它很简单。但由于我无法访问环境变量,因此无法使用
节点配置

所以我想有几个入门脚本,比如

// 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);
  });
};
"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"
}
然而,在electron builder文档中,似乎没有指定条目文件的选项,它总是使用
index.js
来打包应用程序,除了

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

module.exports = (config) => {
  app.on('ready', () => {
    mainWindow.loadURL(config.APP_URL);
  });
};
"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"
}

但是,我真的不知道如何设置electron builder配置的条目文件。如何指定条目文件?

我是用一个黑客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"
}
您可以使用
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'
    }
  }
});

如果您在评论中明确指出
scripts/build
实际上是您的
build.js
,这对乞丐来说应该很好。非常感谢此解决方案。您如何实施此解决方案?在package.json中,我们添加的只是构建。如何覆盖package.json配置。