【问题标题】:How to re-use platform parameter when building an electron application using `electron-forge make --platform=win32`?使用`electron-forge make --platform=win32`构建电子应用程序时如何重用平台参数?
【发布时间】:2021-09-04 19:01:17
【问题描述】:

我们正在为 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() 检测操作系统类型并根据它选择正确的可执行文件。换句话说,在适当的平台上运行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
提前致谢!

【问题讨论】:

    标签: circleci electron-builder wine electron-packager electron-forge


    【解决方案1】:

    Electron Forge 支持钩子,其中一些可以通过平台和拱门,您可以全局保存。

    目前最早通过这些的钩子是packageAfterCopy,对于您的使用来说可能调用得太晚了,但值得一试:

      plugins: [
         // ...
      ],
      hooks: {
        packageAfterCopy: async (
          forgeConfig,
          buildPath,
          electronVersion,
          platform,
          arch
        ) => {
          console.log(buildPath, electronVersion, platform, arch);
        },
      }
    }
    

    我还 opened a PR 将这些参数添加到 generateAssets 挂钩。

    【讨论】:

    • 感谢您的及时帮助!我试过了,是的,它被调用太晚了。
    • ``` root@60cd60fcf184:/project# yarn make --platform=win32 ✔ 检查你的系统 ⠋ 解决 Forge 配置 我得到了 ICON!我得到了原生资产! ✔ 解析 Forge 配置 我们需要先打包您的应用程序,然后才能制作它⠋ 准备打包应用程序以用于 arch:x64 ✔ 编译主进程代码✔ 准备打包应用程序用于 arch:x64 我正在打印 ARCH ------- --------------> x64 ✔ 准备原生依赖 ✔ 为以下目标打包应用程序制作:squirrel ⠸ 为目标制作:squirrel - 在平台上:win32 - 对于arch:x64 ```
    • 我也尝试了generateAssets钩子,它也在我们的getExtraResource()之后被调用,所以我怀疑PR可能不适用于我们的案例。所以我使用process.argv 以非常基本的方式破解了它,哈哈,非常基本。这是提交:github.com/pastelnetwork/pastel-electron-wallet/pull/163/…
    【解决方案2】:

    我们可以使用 process.argv 解决这个问题。
    更具体地说,我们运行这个命令在 linux 容器中构建 windows 安装程序:

    yarn make --platform=win32
    

    字符串win32 可以在任何地方被process.argv[3] 捕获。
    详细实现见here
    如果您有更好的解决方案,请指教!

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2019-11-20
      • 2019-10-05
      • 1970-01-01
      • 2021-02-17
      • 2020-01-22
      • 1970-01-01
      • 2017-11-04
      • 2017-03-04
      相关资源
      最近更新 更多