【问题标题】:Electron executable not recognized by NautilusNautilus 无法识别电子可执行文件
【发布时间】:2019-07-30 07:40:58
【问题描述】:

我无法使用以下命令构建Electron App 的可执行文件:

electron-packager . electron-tutorial-app --overwrite --asar=true --platform=linux --arch=x64 --prune=true --out=release-builds

构建文件是一个共享库文件 (application/x-sharedlib),未在 Ubuntu 18 上执行。相反,我在 Nautilus 中打开文件时收到以下错误消息:

无法显示“electron-tutorial-app”

没有为“共享库”文件安装应用程序。你 想要搜索打开此文件的应用程序?

[否] [是]

有没有办法做到这一点?

【问题讨论】:

    标签: electron electron-packager nautilus


    【解决方案1】:

    TL;DR: 生成的文件实际上是一种新格式的可执行文件。他们没有任何问题。 Nautilus/文件管理器错误地将它们识别为可执行文件。有一些解决方案,例如创建一个 *.desktop 文件来启动应用程序。

    分析

    这种现象是 Electron 构建 Linux 二进制文件的方式发生变化的副作用。提交 9294facf 将二进制格式从 ELF 更改为 PIE。更改非常小,仅影响单个文件 (BUILD.gn)。从版本 4.0.0 开始,Electron 中的更改已生效。

    文件管理器使用file 命令来决定如何处理文件(例如打开图像查看器、文本编辑器或执行文件)。 file 无法区分共享库和 PIE 可执行文件,因此会错误分类 PIE 文件(请参阅相应的 bug report)。

    解决方案

    从终端运行

    由于该问题仅存在于图形文件管理器中,您可以简单地从终端或脚本运行可执行文件。这在一定程度上涉及非技术最终用户,而不是 OP 想要的。

    等待上游修复

    等待file 将 PIE 识别为可执行文件。反过来,这可能会导致 Nautilus 等文件管理器正确启动 PIE。目前尚不清楚这是否会发生或何时发生。如果发生这种情况,它可能只会包含在未来的发行版中。

    使用桌面文件

    创建桌面文件以启动应用程序。无论如何,这是启动桌面应用程序的常见方式。

    使用以下内容创建一个名为 myapp.desktop 的文件。

    [Desktop Entry]
    Name=My Application
    Exec=/path/to/binary
    Terminal=false
    Type=Application
    StartupNotify=true
    Encoding=UTF-8
    

    然后,通过发出chmod +x myapp.desktop 标记桌面文件可执行。双击文件应该会按预期启动应用程序。


    更多信息

    electron-packager 项目中的对应讨论:https://github.com/electron-userland/electron-packager/issues/901。 (要点:这个问题不是由电子包装器引起的,请看上游)

    electron项目中对应的issue是https://github.com/electron/electron/issues/15406。 (要点:他们想在 Linux 上启用 PIE。不是我们的错误,请看上游)

    【讨论】:

    • 如果您不知道如何从像我这样的终端运行:$./app-name 上面的 /issues/901 链接中提到了这一点。我在 Ubuntu 中运行我的应用程序
    • 重新使用.desktop 文件方法,对于那些不知道的人:记得将该文件放入~/.local/share/applications 以便 Gnome 桌面查看、扫描并创建菜单/图标条目在全局菜单系统中为您的应用程序。此外,您可能不需要StartupNotify=true,除非您的应用支持它developer.gnome.org/integration-guide/stable/…
    【解决方案2】:

    对于 Linux(Ubuntu):

    1. 降级 Electron 包:

      npm install electron@3.1.6 --save-dev

    对于全局(如果需要)

    npm install -g electron@3.1.6
    
    1. 执行 electron-packager 命令 - 用于 linux:

      电子包装器。 electron-tutorial-app --overwrite --asar --platform=linux --arch=all --prune=true --out=release-builds

    这将产生 4 个 Linux 文件夹(arch=all)。根据您的操作系统选择一个可以工作的可执行文件。

    【讨论】:

    • 降级 Electron 意味着错过许多功能和错误修复,应仅在极少数情况下考虑。
    【解决方案3】:

    electron-packager 用于打包具有 Electron 版本 4.0.x 的 Linux 应用程序时会出现此问题,而使用以前的 Electron 版本(例如 3.1.x)则没有问题。

    出于某种原因,在 Electron 4.0.x 中,生成的应用文件是一个共享库,而不是一个可执行文件

    在终端窗口中,在应用文件路径上运行file 命令给出:

    ELF 64 位 LSB 共享对象,x86-64,版本 1 (SYSV),动态 已链接,解释器 /lib64/ld-linux-x86-64.so.2,适用于 GNU/Linux 3.2.0, BuildID[sha1]=b9e8ba37118dad1bf605affef41026f813215bc6,剥离

    以前是这样的:

    ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态 已链接,解释器 /lib64/ld-linux-x86-64.so.2,适用于 GNU/Linux 2.6.32, 剥离

    幸运的是,尽管很麻烦,仍然可以通过从终端窗口启动应用程序来运行应用程序,例如将应用程序文件图标拖到终端提示符上,然后输入 Enter。

    【讨论】:

    • 谢谢,@Mikaeru,您的回答使我降级了电子版本并使用电子打包器实用程序中的其他参数进行构建。这至少适用于 Ubuntu Linux。所以,现在也在尝试windows机器。将相应更新。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2021-12-21
    相关资源
    最近更新 更多