Electron制作成安装包
·
自用设备 MacBookPro M1Pro 所以就没写mac打包配置
win安装包还是挺好打的,麻烦的就是linux
linux打包x64 deb包和win一样 加上--x64
extraResources 是因为需要读取一些文件,没需要可写可不写
afterInstall 安装后执行脚本,因为我要创建桌面图标
我的方式就是复制desktop文件到桌面,但是Ubuntu系统此方法不可用,创建成功后也会不被信任无法执行,银河麒麟可以运行,其他系统没测试
每个人安装方式不同,我使用apt安装,所以会用到root权限去安装,但是会导致获取到的用户为root,则普通用户的桌面路径无法获取,偷了个懒没给所有用户安装,只获取了切换root前的普通用户
#!/bin/sh
# 定义日志文件(root可写,确保日志目录存在)
LOG_DIR="/var/log"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/xrubik-install.log"
# 记录脚本开始执行时间
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 安装后脚本开始执行" >> "$LOG_FILE"
# 核心:通过$SUDO_USER获取切换root前的原始普通用户(执行sudo安装的用户)
NORMAL_USER="$SUDO_USER"
# 验证$SUDO_USER有效性,无值则降级检测(兼容直接root登录安装场景)
if [ -z "$NORMAL_USER" ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 未通过sudo安装,尝试检测当前登录普通用户" >> "$LOG_FILE"
# 从登录用户列表中过滤root,取第一个普通用户
NORMAL_USER=$(who | grep -v 'root' | awk '{print $1}' | head -n 1)
# 若仍未获取到,尝试常用默认用户名(可根据实际场景调整)
if [ -z "$NORMAL_USER" ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 未检测到登录用户,尝试默认用户名列表" >> "$LOG_FILE"
for user in "admin" "user""张三"; do
if [ -d "/home/$user" ]; then
NORMAL_USER="$user"
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 匹配到默认用户:$NORMAL_USER" >> "$LOG_FILE"
break
fi
done
fi
fi
# 最终验证普通用户是否有效,无效则终止并记录错误
if [ -z "$NORMAL_USER" ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 错误:未找到有效普通用户,无法复制桌面图标" >> "$LOG_FILE"
exit 0
fi
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 确认目标普通用户:$NORMAL_USER" >> "$LOG_FILE"
# 构建普通用户主目录,定位其桌面目录(优先兼容XDG标准,再适配中英文)
USER_HOME="/home/$NORMAL_USER"
USER_DESKTOP_DIR=""
# 1. 优先通过XDG_DESKTOP_DIR获取用户自定义桌面目录(最准确,兼容所有语言)
if [ -n "$(sudo -u $NORMAL_USER sh -c 'echo $XDG_DESKTOP_DIR 2>/dev/null')" ]; then
USER_DESKTOP_DIR=$(sudo -u $NORMAL_USER sh -c 'echo $XDG_DESKTOP_DIR')
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 通过XDG标准获取桌面目录:$USER_DESKTOP_DIR" >> "$LOG_FILE"
# 2. 兼容中文系统默认桌面目录
elif [ -d "$USER_HOME/桌面" ]; then
USER_DESKTOP_DIR="$USER_HOME/桌面"
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 匹配中文桌面目录:$USER_DESKTOP_DIR" >> "$LOG_FILE"
# 3. 兼容英文系统默认桌面目录
elif [ -d "$USER_HOME/Desktop" ]; then
USER_DESKTOP_DIR="$USER_HOME/Desktop"
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 匹配英文桌面目录:$USER_DESKTOP_DIR" >> "$LOG_FILE"
# 4. 无桌面目录则终止并记录
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 错误:未找到$NORMAL_USER的桌面目录" >> "$LOG_FILE"
exit 0
fi
# 复制.desktop文件到桌面,并解决“未被信任”问题
DESKTOP_FILE="/usr/share/applications/xrubik-simulation.desktop" # 源文件路径
DEST_FILE="$USER_DESKTOP_DIR/xrubik-simulation.desktop" # 目标文件路径
if [ -f "$DESKTOP_FILE" ]; then
# 1. 用普通用户权限复制(避免文件所有者为root,导致权限异常)
sudo -u $NORMAL_USER cp "$DESKTOP_FILE" "$DEST_FILE" 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] .desktop文件复制成功:$DEST_FILE" >> "$LOG_FILE"
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 错误:.desktop文件复制失败" >> "$LOG_FILE"
exit 0
fi
# 2. 设置可执行权限(桌面环境识别为“程序启动文件”的基础)
sudo -u $NORMAL_USER chmod +x "$DEST_FILE" 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 已为目标文件添加可执行权限" >> "$LOG_FILE"
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 警告:添加可执行权限失败(可能仍提示未信任)" >> "$LOG_FILE"
fi
# 3. 关键:通过gio工具添加信任标记(解决桌面“未被信任”提示)
if command -v gio &> /dev/null; then
sudo -u $NORMAL_USER gio set "$DEST_FILE" metadata::trusted true 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 已为目标文件添加桌面信任标记" >> "$LOG_FILE"
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 警告:添加信任标记失败(手动右键勾选权限即可)" >> "$LOG_FILE"
fi
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 提示:系统无gio工具,需手动信任文件(右键→权限→允许执行)" >> "$LOG_FILE"
fi
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 错误:未找到源文件$DESKTOP_FILE" >> "$LOG_FILE"
fi
# 记录脚本执行完毕
echo "[$(date +"%Y-%m-%d %H:%M:%S")] 安装后脚本执行完毕" >> "$LOG_FILE"
exit 0
不同系统出现的问题不同
ubuntu有概率出现沙箱权限问题,银河麒麟暂时没遇到
sudo chown root:root /opt/xrubik-simulation/chrome-sandbox
sudo chmod 4755 /opt/xrubik-simulation/chrome-sandbox
{
"name": "yourAppName",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon --exec electron . --ext .js,.html",
"pack": "electron-builder",
"win": "electron-builder --win --x64",
"linux": "electron-builder --linux deb"
},
"homepage": "https://www.yourWeb.com/",
"build": {
"appId": "111111自己写",
"productName": "yourAppName",
"copyright": "Copyright © 2021 Alaso",
"directories": {
"buildResources": "build",
"output": "dist"
},
"win": {
"target": [
"nsis"
],
"icon": "./favicon.ico"
},
"nsis": {
"oneClick": false,
"language": "2052",
"createDesktopShortcut": true,
"allowToChangeInstallationDirectory": true
},
"linux": {
"target": [
"deb"
],
"icon": "./build/icons",
"category": "Science",
"maintainer": "yourEmail",
"executableName": "yourAppName",
"desktop": {
"Name": "应用显示名称",
"Comment": "简介",
"Keywords": "simulation;power;training",
"Type": "Application",
"Terminal": "false",
"StartupWMClass": "yourAppName",
"MimeType": "查文档写"
}
},
"deb": {
"synopsis": "yourAppName Desktop App",
"afterInstall": "./build/debinstall.sh"
},
"extraResources": [
{
"from": "path/",
"to": "ipPath/"
}
]
},
"author": {
"name": "yourname",
"email": "youremail"
},
"license": "ISC",
"dependencies": {
"electron-log": "^5.3.2"
},
"devDependencies": {
"electron": "^20.1.4",
"electron-builder": "^23.3.3",
"nodemon": "^3.0.2"
}
}
linux图标建议放在文件夹下

修改图标名称和实际尺寸相同例如
256x256.png / 512x512.png
虚拟机ubuntu arm下运行偶尔会有奇奇怪怪的问题无法运行,建议实机测试
更多推荐

所有评论(0)