【问题标题】:No such file or directory inside app.asar (electron/nodejs)app.asar (electron/nodejs) 中没有这样的文件或目录
【发布时间】:2020-04-21 07:53:38
【问题描述】:

我正在构建一个运行 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 中。

【问题讨论】:

    标签: python node.js electron


    【解决方案1】:

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

    使用 pyinstaller 编译为可执行二进制文件。 所以你可以像这样添加 electron-builder 配置来将这个 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

    【讨论】:

      【解决方案2】:

      应该有两条路径,一条用于开发构建,另一条用于生产。在这个例子中,路径可能不是你想要的,但应该让你走上正确的轨道。在生产模式下,getAppPath() 函数将为您提供 app.asar 文件的路径。

      const getPythonPath = fileName => {
          const path = require('path')
          const isDevBuild = process.env.NODE_ENV === 'development'
      
          if (isDevBuild) {
              return path.resolve(__dirname, `./python/${fileName}`)
          } else {
              const { app, remote } = require('electron')
              // check main or renderer process for app path
              const appPath = app ? app.getAppPath() : remote.app.getAppPath()
              return path.resolve(appPath, `./python/${fileName}`)
          }
      }
      
      const subprocess = spawn('python', ['-u', getPythonPath('myscript.py'), arg])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-27
        • 2017-01-18
        • 2021-05-21
        • 1970-01-01
        • 2021-06-24
        • 2015-02-20
        • 1970-01-01
        相关资源
        最近更新 更多