Linux打包
概述
常见的Linux桌面系统有Fedora、Ubuntu,以及统信USO、Deepin等国产系统。Linux中主流的软件包有deb
和rpm
两种格式;其中deb
适用于Debian、Ubuntu等,rpm
适用于CentOS、Fedora、OpenSUSE等;但对于桌面级Linux系统,还可以使用AppImage
格式包。
AppImage
包和rpm
包都无法直接双击安装,安装必须先赋予执行权限;尤其是AppImage
包,其能否安装成功完全依赖于当前系统是否有相关的依赖软件;但deb
包可直接双击安装;
在linux中,deb
包是为系统安装而设计的,deb
包默认都会安装到 /opt
目录下 ;因为 /opt
是一个系统目录,只有 root 用户有写权限;因此deb
包安装的electron应用在运行时是无法对文件进行写或赋予执行权限的。
综上,在Linux中没有完美的打包方式,最终借鉴vs code打包成.deb
和.rpm
;并在软件首次启动时,将需要执行或写入的文件复制到用户目录下;复制到用户目录下以后,就可以进行任意操作。electron应用默认安装在/opt
等系统目录下,该目录普通用户无法写入;如果强制通过chmod
命令修改/opt
系统目录下的文件权限,会破坏系统安全规范,可能被系统安全策略阻止,会造成很多不稳定因素。借鉴vscode,将electron应用中需要写入和执行的文件复制到用户目录下,再进行任意操作。例如在用户目录创建文件夹 ~/.sidoc-desktop-frp/
,并在该文件夹中放置所有需要写入和执行的文件;.sidoc-desktop-frp
是一个隐藏目录,此举借鉴自vscode和其它应用,例如:~/.vscode/
。
常用问题
1>. 在Ubuntu中双击deb
安装包,无法弹出安装界面时,可通过如下命令进行安装;如下命令安装时会显示安装过程中的错误,这些错误可能就是无法弹出安装界面的原因:
sudo dpkg -i /path/to/your-package.deb
2> 在Ubuntu中,.desktop
启动器文件在 /usr/share/applications
目录下;
3> 关闭沙盒:为了提高软件在Linux系统中的兼容性,需要在软件的启动命令上加如下参数,以禁用沙盒和GPU;
## 如下配置项 electron-build 配置文件中;
## 如下参数会被加到软件的启动命令上
"executableArgs": ["--no-sandbox", "--disable-gpu"]
关于沙箱机制
Electron 默认启用了 Chromium
的沙箱机制,用于隔离进程以提升electron应用的安全性;以避免渲染进程直接调用 Node.js 的底层 API(如:fs
、child_process
),导致恶意代码执行系统命令、读写文件等危险操作;如:require('child_process').exec('rm -rf /');
多数Linux不允许软件在root下以沙箱模式启动,因此对于Electron应用,任何情况下都不应该在root用户下启动;当然,在Linux系统中,所有日常应用本就应该在非root用户下运行,root仅用于执行某些高级操作。
最佳实践是在打包时对eletron应用进行配置,以便用户在安装electron应用后自动执行如下命令,以启用沙盒:
sudo chown root:root chrome-sandbox
sudo chmod 4755 chrome-sandbox ## 设置 setuid 位
但electron应用的沙盒依赖于 setuid
机制来实现,如果linux系统环境本身禁用了 setuid
或没有安装chromium-sandbox,则无论执行什么命令都无法启用沙盒。
如下图所示,大厂开发的Electron应用基本都禁用沙盒,以提升兼容性:
综上,为了提升应用的兼容性,推荐在Linux中的eletron应用中关闭沙盒。
安装deb和rpm包
如果打包为deb和rpm格式,则可按如下方式安装,不同Linux的安装方式可能略有差异;
0.1> 在Fedora桌面系统中安装rpm包 -----------------------------------------------------------------------
## 切到root用户
sudo -i
## 增加执行权限
sudo chmod +x package.rpm
## 安装软件
sudo dnf install package.rpm
## 卸载软件
sudo rpm -e package
0.2> 在Ubuntu桌面系统中安装deb包 -----------------------------------------------------------------------
## 直接双击安装即可,但可能因为沙盒权限问题而无法启动,因此要用如下命令以临时关闭沙盒的方式启动
sidoc-frp-desktop --no-sandbox