Electron-builder 没有捆绑 python 文件

ish*_*007 4 python node.js python-3.x electron electron-builder

这是我的目录结构,其中renderer.js包含index.html. python 脚本visitor.py是通过python-shelldownload.py调用的。一旦我捆绑,它就无法找到Python脚本renderer.js

  |_ index.html
  |_ styles.css
  |_ main.js
  |_ package.json
  |_ dist/
  |_ node_modules/
  |_ renderer.js
  |_ visitor.py
  |_ download.py
Run Code Online (Sandbox Code Playgroud)

我试着把所有东西都放进去files: [...]然后跑。我还尝试将 python 文件显式复制到文件夹,然后运行​​. 没有人在工作。package.jsonbuild > filesnpm run distdistnpm run dist

/Application/test.app/Contents/Resources/app.asar/remderer.js:226 错误:python:无法打开文件“visitor.py”:[错误 2] 没有这样的文件或目录

这是我的 package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "pack": "build --dir",
    "dist": "build"
  },
  "author": "",
  "license": "ISC",
  "build": {
    "appId": "com.example.app",
    "files": [
      "dist/",
      "node_modules/",
      "index.html",
      "main.js",
      "package.json",
      "renderer.js",
      "styles.css",
      "visitor.py",
      "download.py"
    ],
    "dmg": {
      "contents": [
        {
          "x": 110,
          "y": 150
        },
        {
          "x": 240,
          "y": 150,
          "type": "link",
          "path": "/Applications"
        }
      ]
    },
    "linux": {
      "target": [
        "AppImage",
        "deb"
      ]
    },
    "win": {
      "target": "squirrel",
      "icon": "build/icon.ico"
    }
  },
  "dependencies": {
    "csv-parse": "^2.5.0",
    "electron-css": "^0.6.0",
    "npm": "^6.1.0",
    "python-shell": "^0.5.0",
  },
  "devDependencies": {
    "electron": "^2.0.3",
    "electron-builder": "^20.19.1"
  }
}
Run Code Online (Sandbox Code Playgroud)

PS:这是我正在谈论的电子构建器 https://github.com/electron-userland/electron-builder

cri*_*fan 5

请确保不是你的错字

\n\n

/Application/test.app/Contents/Resources/app.asar/remderer.js:226 Error: python: can\'t open file \'visitor.py\': [Error 2] No such file or directoryremderer.js,但其他地方是renderer.js,所以请确保不是你的拼写错误。如果是,请更正。

\n\n
\n\n

原因

\n\n

实际上electron-builder 捆绑了你的python文件,但是由于asar,你python-shell找不到你的python文件,所以导致了错误。

\n\n

怎么修

\n\n

解决方案一:

\n\n

最简单但官方不推荐:禁用asar

\n\n

如何disable asar

\n\n

将你改为package.json

\n\n
{\n...\n  "build": {\n    "appId": "com.example.app",\n...\n    "asar": false,\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在你的renderer.js,其中包含python-shell代码,可能是这样的:

\n\n
{\n...\n  "build": {\n    "appId": "com.example.app",\n...\n    "asar": false,\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在应该工作了。

\n\n

内部逻辑

\n\n

禁用asar后,所有相关文件路径不再包含asar,变成这样:

\n\n
    \n
  • /Application/test.app/Contents/Resources/app/visitor.py
  • \n
  • /Application/test.app/Contents/Resources/app/renderer.js
  • \n
\n\n

.app文件结构为:

\n\n
|_ test.app\n    |_ Contents\n        |_ Resources\n            |_ app\n                |_ styles.css\n                |_ main.js\n                |_ package.json\n                |_ dist/\n                |_ node_modules/\n                |_ renderer.js\n                |_ visitor.py\n                |_ download.py\n                ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

解决方案2:

\n\n

保持启用asar,将额外的文件放入unpack

\n\n

如何解压asar

\n\n

将你改为package.json

\n\n
{\n...\n  "build": {\n    "appId": "com.example.app",\n...\n    "asar": true,\n    "asarUnpack": [\n      "visitor.py",\n      "download.py"\n      "renderer.js"\n    ],\n
Run Code Online (Sandbox Code Playgroud)\n\n

打包后的.app文件结构为:

\n\n
|_ test.app\n    |_ Contents\n        |_ Resources\n            |_ app.asar             # a single compressed binary file\n            |_ app.asar.unpacked    # a folder/directory, contain unpacked origin files\n                |_ visitor.py\n                |_ download.py\n                |_ renderer.js\n
Run Code Online (Sandbox Code Playgroud)\n\n

你的renderer.js也许不需要改变,并且应该可以工作。

\n\n

更多详细信息asarUnpack请参考官方文档:Overridable per Platform Options

\n\n
\n\n

PS:其他一些asar和相关尝试,可以参考我的中文帖子:\xe3\x80\x90\xe5\xb7\xb2\xe8\xa7\xa3\xe5\x86\xb3\xe3\x80\x91mac\xe4\xb8\ xadPyInstaller\xe6\x89\x93\xe5\x8c\x85\xe5\x90\x8e\xe7\x9a\x84\xe4\xba\x8c\xe8\xbf\x9b\xe5\x88\xb6\xe6\x96\x87\ xe4\xbb\xb6\xe5\x9c\xa8电子生成器\xe6\x89\x93\xe5\x8c\x85\xe5\x90\x8eapp\xe4\xb8\xad\xe6\x9c\x89\xe4\xba\x9b\ xe6\x97\xa0\xe6\xb3\x95\xe9\x80\x9a\xe8\xbf\x87child_process\xe7\x9a\x84execFile\xe8\xbf\x90\xe8\xa1\x8c

\n