使用`electron-forge make --platform=win32`构建电子应用程序时如何重用平台参数?
How to re-use platform parameter when building an electron application using `electron-forge make --platform=win32`?
我们正在为 macos、linux 和 windows 构建电子桌面应用程序。
这是我们的电子锻造配置:
// forge.config.js
const os = require('os')
const package = require('./package.json')
function getExtraResource() {
const p = os.platform()
switch (p) {
case 'darwin':
return ['./static/bin/pasteld-mac']
case 'linux':
return ['./static/bin/pasteld-linux']
case 'win32':
return ['./static/bin/pasteld-win.exe']
default:
throw new Error(
'forge.config.js error: your OS is not supported. Supported OS are: darwin, linux, win32',
)
}
}
function getIcon() {
const p = os.platform()
switch (p) {
case 'darwin':
return './static/icons/icon.icns'
case 'linux':
return './static/icons/icon.png'
case 'win32':
return './static/icons/icon.ico'
default:
throw new Error(
'forge.config.js error: your OS is not supported. Supported OS are: darwin, linux, win32',
)
}
}
module.exports = {
packagerConfig: {
name: package.productName,
executableName: package.name,
icon: getIcon(),
asar: true,
extraResource: getExtraResource(),
protocols: [
{
protocol: package.name,
name: package.name,
schemes: [package.protocolSchemes.native],
},
],
},
makers: [
{
name: '@electron-forge/maker-squirrel',
config: {
exe: `${package.name}.exe`,
setupIcon: './static/icons/icon.ico',
loadingGif: './static/icons/icon.gif',
iconUrl:
'https://raw.githubusercontent.com/pastelnetwork/pastel-electron-wallet/master/static/icons/icon.ico',
title: package.productName,
setupExe: `${package.productName} Setup - v${package.version}.exe`,
skipUpdateIcon: true,
},
},
{
name: '@electron-forge/maker-dmg',
config: {
icon: './static/icons/icon.icns',
name: package.productName,
},
},
{
name: '@electron-forge/maker-deb',
config: {
options: {
icon: './static/icons/icon.png',
},
},
},
],
plugins: [
[
'@electron-forge/plugin-webpack',
{
mainConfig: './webpack.main.config.js',
renderer: {
config: './webpack.renderer.config.js',
entryPoints: [
{
html: './src/index.html',
js: './src/renderer.tsx',
name: 'main_window',
},
],
},
},
],
],
}
正如您在上面的文件中看到的,getExtraResource()
检测到 os 类型并根据它选择正确的可执行文件。换句话说,运行 run make
在适当的平台上是我们构建应用程序所需要的。
但是,我们现在要在 linux wine 映像上构建 windows 安装程序,更具体地说,使用 electronuserland/builder:wine-mono
映像。
到目前为止一切都按预期工作,除了一件事 - 我们仍然需要在 getExtraResource()
中的 switch 子句中添加一个步骤来选择构建器映像中的 windows 可执行文件而不是 linux可执行文件(请注意构建器映像仍然是 linux 映像!)。
它将是这样的:
# forge.config.js
//...
function getExtraResource() {
const p = os.platform()
switch (p) {
case 'darwin':
return ['./static/bin/pasteld-mac']
case 'linux':
if (build_arg === 'win32') {
return ['./static/bin/pasteld-win.exe']
}
return ['./static/bin/pasteld-linux']
case 'win32':
return ['./static/bin/pasteld-win.exe']
default:
throw new Error(
'forge.config.js error: your OS is not supported. Supported OS are: darwin, linux, win32',
)
}
}
//...
如何获取上述文件中的build_arg
?
构建命令在 wine builder 镜像中是 yarn make --platform=win32
。
提前致谢!
Electron Forge 支持钩子,其中一些钩子通过了平台和架构,您可以全局保存。
目前最早通过这些的钩子是packageAfterCopy
,它可能被调用为时已晚,但值得一试:
plugins: [
// ...
],
hooks: {
packageAfterCopy: async (
forgeConfig,
buildPath,
electronVersion,
platform,
arch
) => {
console.log(buildPath, electronVersion, platform, arch);
},
}
}
我还 opened a PR 将这些参数添加到 generateAssets
挂钩。
我们可以使用 process.argv
来解决这个问题。
更具体地说,我们 运行 这个命令在 linux 容器中构建 windows 安装程序:
yarn make --platform=win32
并且字符串 win32
可以在任何地方被 process.argv[3]
捕获。
具体实现见here.
如果您有更好的解决方案请指教!
我们正在为 macos、linux 和 windows 构建电子桌面应用程序。
这是我们的电子锻造配置:
// forge.config.js
const os = require('os')
const package = require('./package.json')
function getExtraResource() {
const p = os.platform()
switch (p) {
case 'darwin':
return ['./static/bin/pasteld-mac']
case 'linux':
return ['./static/bin/pasteld-linux']
case 'win32':
return ['./static/bin/pasteld-win.exe']
default:
throw new Error(
'forge.config.js error: your OS is not supported. Supported OS are: darwin, linux, win32',
)
}
}
function getIcon() {
const p = os.platform()
switch (p) {
case 'darwin':
return './static/icons/icon.icns'
case 'linux':
return './static/icons/icon.png'
case 'win32':
return './static/icons/icon.ico'
default:
throw new Error(
'forge.config.js error: your OS is not supported. Supported OS are: darwin, linux, win32',
)
}
}
module.exports = {
packagerConfig: {
name: package.productName,
executableName: package.name,
icon: getIcon(),
asar: true,
extraResource: getExtraResource(),
protocols: [
{
protocol: package.name,
name: package.name,
schemes: [package.protocolSchemes.native],
},
],
},
makers: [
{
name: '@electron-forge/maker-squirrel',
config: {
exe: `${package.name}.exe`,
setupIcon: './static/icons/icon.ico',
loadingGif: './static/icons/icon.gif',
iconUrl:
'https://raw.githubusercontent.com/pastelnetwork/pastel-electron-wallet/master/static/icons/icon.ico',
title: package.productName,
setupExe: `${package.productName} Setup - v${package.version}.exe`,
skipUpdateIcon: true,
},
},
{
name: '@electron-forge/maker-dmg',
config: {
icon: './static/icons/icon.icns',
name: package.productName,
},
},
{
name: '@electron-forge/maker-deb',
config: {
options: {
icon: './static/icons/icon.png',
},
},
},
],
plugins: [
[
'@electron-forge/plugin-webpack',
{
mainConfig: './webpack.main.config.js',
renderer: {
config: './webpack.renderer.config.js',
entryPoints: [
{
html: './src/index.html',
js: './src/renderer.tsx',
name: 'main_window',
},
],
},
},
],
],
}
正如您在上面的文件中看到的,getExtraResource()
检测到 os 类型并根据它选择正确的可执行文件。换句话说,运行 run make
在适当的平台上是我们构建应用程序所需要的。
但是,我们现在要在 linux wine 映像上构建 windows 安装程序,更具体地说,使用 electronuserland/builder:wine-mono
映像。
到目前为止一切都按预期工作,除了一件事 - 我们仍然需要在 getExtraResource()
中的 switch 子句中添加一个步骤来选择构建器映像中的 windows 可执行文件而不是 linux可执行文件(请注意构建器映像仍然是 linux 映像!)。
它将是这样的:
# forge.config.js
//...
function getExtraResource() {
const p = os.platform()
switch (p) {
case 'darwin':
return ['./static/bin/pasteld-mac']
case 'linux':
if (build_arg === 'win32') {
return ['./static/bin/pasteld-win.exe']
}
return ['./static/bin/pasteld-linux']
case 'win32':
return ['./static/bin/pasteld-win.exe']
default:
throw new Error(
'forge.config.js error: your OS is not supported. Supported OS are: darwin, linux, win32',
)
}
}
//...
如何获取上述文件中的build_arg
?
构建命令在 wine builder 镜像中是 yarn make --platform=win32
。
提前致谢!
Electron Forge 支持钩子,其中一些钩子通过了平台和架构,您可以全局保存。
目前最早通过这些的钩子是packageAfterCopy
,它可能被调用为时已晚,但值得一试:
plugins: [
// ...
],
hooks: {
packageAfterCopy: async (
forgeConfig,
buildPath,
electronVersion,
platform,
arch
) => {
console.log(buildPath, electronVersion, platform, arch);
},
}
}
我还 opened a PR 将这些参数添加到 generateAssets
挂钩。
我们可以使用 process.argv
来解决这个问题。
更具体地说,我们 运行 这个命令在 linux 容器中构建 windows 安装程序:
yarn make --platform=win32
并且字符串 win32
可以在任何地方被 process.argv[3]
捕获。
具体实现见here.
如果您有更好的解决方案请指教!