代码之家  ›  专栏  ›  技术社区  ›  crazyoptimist

使用“electron forge make--platform=win32”构建电子应用程序时如何重用平台参数?

  •  0
  • crazyoptimist  · 技术社区  · 4 年前

    我们正在为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() 在构建器映像中选择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 在上面的文件中?
    生成命令是 yarn make --platform=win32 在葡萄酒制造商的形象中。
    提前谢谢!

    0 回复  |  直到 4 年前
        1
  •  1
  •   Tim    4 年前

    Electron Forge支持钩子,其中一些钩子通过了平台和拱门,可以在全球范围内保存。

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

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

    opened a PR 将这些参数添加到 generateAssets

        2
  •  0
  •   crazyoptimist    4 年前

    我们可以通过使用 process.argv .

    yarn make --platform=win32
    

    win32 可能会被 process.argv[3]
    请参见详细的实现 here .
    如果您有更好的解决方案,请提供建议!