首页 > 解决方案 > 使用 angular-electron 打包可执行二进制文件

问题描述

我正在尝试在 Linux 上使用 angular-electron 打包一个 python 二进制可执行文件。我从堆栈溢出中遵循了这个答案。 将预编译的二进制文件捆绑到电子应用程序中。

在 main.ts 中,我编写了这个额外的代码片段。我已将可执行二进制文件放在 node_modules/datapod/datapod 中,并将此路径符号链接到 node_modules/.bin/ 文件夹中。

  const spawn = require('child_process').spawn;
  var appRootDir = require('app-root-dir').get();

  var datapodpath=appRootDir+'/node_modules/datapod/datapod';
  console.log(datapodpath)

  const datapod = spawn(datapodpath, [], {});  //add whatever switches you need here

  datapod.stdout.on( 'data', data => {
      console.log( `stdout: ${data}` );
    });
  datapod.stderr.on( 'data', data => {
      console.log( `stderr: ${data}` );
   })
   datapod.on( 'close', code => {
    console.log( `child process exited with code ${code}` );
  })

当我这样做时,一切都很好

npm 开始

我还可以看到 python 应用程序的日志。当我做 ,

npm 运行电子:linux

应用程序使用二进制文件成功编译(因为使用二进制文件编译的应用程序的大小正好等于裸角应用程序 + 二进制文件的大小)。当我尝试运行这个编译的应用程序时,它失败并出现以下错误。

在此处输入图像描述 更新:我尝试了另一种方法,但仍然没有结果。我创建了一个新文件夹 externals/bin 并在此文件夹中复制了可执行二进制文件“datapod”。要将此文件夹复制到打包的应用程序中,请将这些行添加到 electron-builder.js

 "files": [
        "**/*",
        "!**/*.ts",
        "!*.code-workspace",
        "!LICENSE.md",
        "!package.json",
        "!package-lock.json",
        "!src/",
        "!e2e/",
        "!hooks/",
        "!angular.json",
        "!_config.yml",
        "!karma.conf.js",
        "!tsconfig.json",
        "!tslint.json",
        "externals/bin"
    ],

在 main.ts 文件中编辑了我的代码

const appPath = process.env.NODE_ENV === 'production' ? process.resourcesPath : __dirname;


  const execPath =path.join(appPath, 'externals/bin/datapod');
  console.log(execPath)

编译成功,当我尝试运行这个应用程序时,我得到了同样的错误。我在 /tmp/.moun-angular***/resources/app.asar 中解压了应用程序

npx asar extract /tmp/.mount_angulaG6ARST/resources/app.asar extrractedApp

该文件夹的内容确实有 externals/bin/datapod 文件但无法运行。

标签: pythonnode.jsangularelectronelectron-builder

解决方案


将此代码段添加到您的 electron-builder.json 中。

  "extraResources": [
    {
      "from": "src/bin",
      "to": "bin",
      "filter": "**/*"
    }
  ],

在生产的这一点上,文件将被复制到应用程序的根 bin 文件夹中。下面是我创建的一个函数,用于在开发和生产模式下执行文件。

  const root = process.cwd();

  getBinaryPath(binaryName: string) {
    const binariesPath = this.isProduction() ? path.join(root, 'resources', 'bin') : path.join(root, 'src', 'bin');
    return path.resolve(path.join(binariesPath, binaryName));
  }

推荐阅读