首页 > 解决方案 > app.asar (electron/nodejs) 中没有这样的文件或目录

问题描述

我正在构建一个运行 nodejs 的电子应用程序。gui 运行 html/js,并且我还有一些在后台运行的 python 脚本向用户显示数据。

当我在本地运行时它运行良好npm start,但是当我选择将应用程序与electron-packager库一起打包时,python 没有运行,并且在里面找不到app.asar

我相信解决方案是围绕使用展开的const originalFs = require('original-fs');originalFs.readFileSync(FILE);但我对很多部署方面都是全新的,我不知道我是否走错了方向,或者这是否根本不可能。我的代码如下:

    const subprocess = spawn('python', ['-u', __dirname + "/python/myscript.py", arg])
    subprocess.stdout.on('data', (data) => {
        console.log(`data:${data}`);
    });
    subprocess.stderr.on('data', (data) => {
        console.log(`error:${data}`);
    });
    subprocess.stderr.on('close', () => {
        console.log("Closed");
        app.quit()
    });

我也尝试设置--asar=false并进入 /resources/app/ 文件夹以获取myscript.py文件。这为应用程序提供了全部功能,但是,如果可能的话,我仍然希望能够将其全部打包asar.app

标签: pythonnode.jselectron

解决方案


在您的 Electron 应用程序中运行您的 python。请将您的 python 文件编译为可执行的二进制文件,并使您的电子应用程序嵌入此 bin 文件。这样即使没有在该设备上安装 python,这个电子应用程序也可以在任何设备上运行。这样会更舒服。

使用pyinstaller编译为可执行二进制文件。因此,您可以像这样添加电子生成器配置以将这个 bin 从 asar 中存储出来。

"build": {
    "extraResources": [
        {
            "from": "bin",
            "to": "bin"
        }
    ]
}

打包后,这会将 bin 文件夹复制到/resource/bin 以便运行 bin 文件

let extension = '';
switch (process.platform) {
  case 'darwin':
  default:
    break;
  case 'win32':
  case 'win64':
    extension = '.exe';
    break;
}


const basicURL =
  process.env.NODE_ENV === 'development'
    ? path.join(__dirname, '../../bin')
    : path.join(process.resourcesPath, 'bin');

const binURL = path.join(
  basicURL,
  `bin${extension}`
);
spawn(binURL, params);

我推荐electron-builder而不是electron-packager


推荐阅读