Electron集成Java服务端制作deb包

环境和源文件

  • 净室环境

    净室环境指的是没有任何其他配置,刚刚安装好的一个系统环境。
    净室环境是为了避免一些依赖问题。
    可以通过虚拟机或者实体机来获得,这里推荐使用虚拟机,实体机相对成本更高。

  • 净室环境系统:
    本次使用系统环境为 deepin-desktop-community-20.3-amd64


  • 源文件结构树:

    demo文件夹为electron:build后输出的文件夹(Linux环境下)
    其中scripts、server、res文件夹为后添加到demo目录中

    demo
    ├── chrome_100_percent.pak
    ├── chrome_200_percent.pak
    ├── chrome_crashpad_handler
    ├── chrome-sandbox
    ├── demo                --electron打包成的Linux可执行文件
    ├── icudtl.dat
    ├── libEGL.so
    ├── libffmpeg.so
    ├── libGLESv2.so
    ├── libvk_swiftshader.so
    ├── libvulkan.so.1
    ├── LICENSE.electron.txt
    ├── LICENSES.chromium.html
    ├── locales
    ├── resources
    ├── resources.pak
    ├── scripts             --配置脚本和服务
    │   └── demo.service    --Linux服务(后续有详解)
    ├── server              --Java服务
    │   ├── demo.jar        --Java服务jar包
    │   └── jre             --jre运行环境
    ├── snapshot_blob.bin
    ├── swiftshader
    ├── res                 --资源文件夹
    │   └── Favs.ico        --图标ico文件
    ├── v8_context_snapshot.bin
    └── vk_swiftshader_icd.json
    
    

Service服务配置

  • demo.service完整内容(使用打包到deb包中的jre执行jar包)

    如果不注册成linux服务的话每次都需要执行Java -jar demo.jar 很麻烦,对使用者也十分的不友好,所以这里将jar包服务注册到linux服务中,并设置开机自启。

    [Unit]
    Description=demo-server                                    
    
    [Service]
    Type=simple                                                 
    ExecStart=/usr/local/demo/server/jre/bin/java -jar /usr/local/demo/server/demo.jar
    
    [Install]
    WantedBy=multi-user.target
    
    
  • Service 区块配置

    • [Unit] 区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

    字段 说明
    Description 简短描述
    Documentation 文档地址
    Requires 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
    Wants 与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
    BindsTo 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
    Before 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
    After 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
    Conflicts 这里指定的 Unit 不能与当前 Unit 同时运行
    Condition... 当前 Unit 运行必须满足的条件,否则不会运行
    Assert... 当前 Unit 运行必须满足的条件,否则会报启动失败
    • [Install] 通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

    字段 说明
    WantedBy 它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
    RequiredBy 它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
    Alias 当前 Unit 可用于启动的别名
    Also 当前 Unit 激活(enable)时,会被同时激活的其他 Unit
    • [Service] 区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

    字段 说明
    Type 定义启动时的进程行为。它有以下几种值。
    Type=simple 默认值,执行ExecStart指定的命令,启动主进程
    Type=forking 以 fork 方式从父进程创建子进程,创建后父进程会立即退出
    Type=oneshot 一次性进程,Systemd 会等当前服务退出,再继续往下执行
    Type=dbus 当前服务通过D-Bus启动
    Type=notify 当前服务启动完毕,会通知Systemd,再继续往下执行
    Type=idle 若有其他任务执行完毕,当前服务才会运行
    ExecStart 启动当前服务的命令
    ExecStartPre 启动当前服务之前执行的命令
    ExecStartPost 启动当前服务之后执行的命令
    ExecReload 重启当前服务时执行的命令
    ExecStop 停止当前服务时执行的命令
    ExecStopPost 停止当其服务之后执行的命令
    RestartSec 自动重启当前服务间隔的秒数
    Restart 定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
    TimeoutSec 定义 Systemd 停止当前服务之前等待的秒数
    Environment 指定环境变量

Debian打包结构和配置

  • deb包结构

    它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)

  • 打包完整目录树

    pkg
    ├── DEBIAN
    │   ├── control
    │   ├── postinst
    │   ├── postrm
    │   ├── preinst
    │   └── prerm
    └── usr
        ├── local
        │   └── demo            --此demo文件夹为上边源文件demo
        └── share
            └── applications
                └── demo.desktop
    
    
  • Control完整内容:

    Package: demo
    Section: Internet
    Priority: extra
    Version: 1.0.0
    Maintainer: liuCh
    Architecture: amd64
    Depends: libappindicator3-1
    Recommends: libwebkit2gtk-4.0.37,libwebkitgtk-3.0-0
    Description: This is demo
    
  • Control:
    这个文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。


    字段 说明 例子/备注
    Package 程序名称 中间不能有空格
    Version 软件版本
    Description 程序说明
    Section 软件类别 utils, net, mail, text, x11
    Priority 软件对于系统的重要程度 required, standard, optional, extra等;
    Essential 是否是系统最基本的软件包 yes/no,若为yes,则不允许卸载(除非强制性卸载)
    Architecture 软件所支持的平台架构 i386, amd64, m68k, sparc, alpha, powerpc等
    Source 软件包的源代码名称
    Depends 软件所依赖的其他软件包和库文件 若依赖多个软件包和库文件,采用逗号隔开
    Pre-Depends 软件安装前必须安装、
    配置依赖性的软件包和库文件 常用于必须的预运行脚本需求
    Recommends 推荐安装的其他软件包和库文件
    Suggests 建议安装的其他软件包和库文件
  • preinst完整内容: (校验是否已存在demo文件夹和是不是root用户安装)

    #!/bin/bash
    if [ -d "/usr/local/demo" ]; then
    	echo "error: please uninstall demo package first."
    	exit 1;
    fi
    	if [ $(whoami) != 'root' ]; then
    		if [ "$1" == "" ]; then
    			echo 'demo client needs root to complete installation'
    		else
    			echo "$1"
    		fi
    		exit 1
    	fi
    
  • preinst:
    在Deb包文件解包之前(即软件安装前),将会运行该脚本。可以停止作用于待升级软件包的服务,直到软件包安装或升级完成。

  • postinst完整内容:(创建日志文件夹和注册demo.service服务设置开机自启并启动)

    #!/bin/bash
    
    #kill all runing demo
    killall demo > /dev/null 2>&1
    
    #clear log files
    if [ -d '/var/log/demo' ]; then
      rm -rf /var/log/demo
    fi
    
    mkdir /var/log/demo
    chmod 777 /var/log/demo
    
    #echo "create init"
    cp /usr/local/demo/scripts/demo.service /etc/systemd/system/demo.service || echoAndExit 'can not copy init file demo.service'
    
    #设置开机自启
    systemctl enable demo.service
    
    #启动服务
    systemctl start demo.service
    
    #创建桌面快捷图标
    cp /usr/share/applications/demo.desktop /home/$(who | awk '{print $1}')/Desktop/
    
    
  • postinst:
    负责完成安装包时的配置工作。如新安装或升级的软件重启服务。软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。

  • prerm完整内容:(删除服务)

    #!/bin/bash
    systemctl stop demo.service
    
    systemctl disable demo.service
    
    rm /etc/systemd/system/demo.service > /dev/null 2>&1
    
  • prerm:
    该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。

  • postrm完整内容:(删除创建的日志文件夹)

    #!/bin/bash
    if [ "$1" == "purge" ]; then
    	if [ -d "/var/log/demo" ]; then
    		rm -rf /var/log/demo
    	fi
    fi
    
  • postrm:
    负责修改软件包链接或文件关联,或删除由它创建的文件。软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行

  • demo.desktop完整内容

    [Desktop Entry]
    #StartupWMClass=demo
    Categories=Network;RemoteControl;
    Comment=This is demo
    Comment[zh_CN]=这是一个演示
    Exec=/usr/local/demo/demo
    GenericName=demo
    GenericName[zh_CN]=演示程序
    Icon=/usr/local/demo/res/Favs.ico
    Name=demo
    Name[zh_CN]=演示
    StartupNotify=false
    Terminal=false
    Type=Application
    X-Deepin-Vendor=user-custom
    
  • desktop
    Desktop Entry文件是Linux桌面系统中用于描述程序启动配置信息的文件,它以.desktop为后缀名,相当于Windows系统下的桌面快捷方式。通常一个二进制可执行程序是一个没有后缀没有图标的文件,不可以随意移动。
    因此很多Linux发行版都提供了启动器,便于集中管理应用程序。启动器本质是一个位于/usr/share/applications/路径下的目录。启动器目录中存放着很多.desktop文件,每个.desktop文件都是一个应用程序的入口,并且.desktop文件可以显示图标,对用户更加友好。

    • desktop 文件结构
    字段 是否必选 说明
    Version 该数值指定了当前 Desktop Entry 文件所遵循的 Desktop Entry 文件标准版本
    Name 应用程序名称
    GenericName 应用程序的通用名称
    Comment 描述
    Type "Type"定义了Desktop Entry文件的类型。常见的"Type"数值是"Application"和"Link"。"Type = Application"表示当前Desktop Entry文件指向了一个应用程序;而"Type = Link"表示当前Desktop Entry文件指向了一个URL (Uniform Resource Locator)。
    Exec "Exec"只有Type=Application才有效,"Exec"的数值定义了启动指定应用程序所要执行的命令,在此命令是可以带参数的
    URL "URL"只有Type=Link才有效。"URL"的数值定义了该Desktop Entry文件指向的URL
    Icon "Icon"的数值是以绝对路径的格式给出,图标的绝对路径。
    StartupNotify 布尔值,只有Type=Application才有效,如果为true,则已知应用程序在使用DESKTOP_STARTUP_ID环境变量集启动时将发送“remove”消息。
    Terminal 布尔值,只有Type=Application才有效,相关应用程序(即关键字"Exec"的数值)是否需要在终端窗口中运行.
    Categories 只有Type=Application才有效,程序在菜单中显示的类别,network:网络应用;Chat:社交沟通;Audio:音乐欣赏;Video:视频播放;Graphics:图形图像;Office:办公学习;Translation:阅读翻译;Development:编程开发;Utility:系统管理;
  • 补充:

    • 文件比较运算符

    命令 说明 例子/备注
    -e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
    -d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
    -f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
    -L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
    -r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
    -w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
    -x filename 如果 filename可执行,则为真 [ -x /usr/bin/grep ]
    filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
    filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

    • 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

    命令 说明 例子/备注
    -z string 如果 string长度为零,则为真 [ -z "$myvar" ]
    -n string 如果 string长度非零,则为真 [ -n "$myvar" ]
    string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
    string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]

    • 算术比较运算符

    命令 说明 例子/备注
    num1-eq num2 等于 [ 3 -eq $mynum ]
    num1-ne num2 不等于 [ 3 -ne $mynum ]
    num1-lt num2 小于 [ 3 -lt $mynum ]
    num1-le num2 小于或等于 [ 3 -le $mynum ]
    num1-gt num2 大于 [ 3 -gt $mynum ]
    num1-ge num2 大于或等于 [ 3 -ge $mynum ]

dpkg命令

  • 打包

    dpkg -b . demo.deb
    

    第一个参数为需要打包的目录路径("."为当前目录),第二个参数为deb包名

  • 安装

    dpkg -i demo.deb
    
  • 强制安装

    dpkg --force-depends -i demo.deb
    

    强制安装可能会有依赖问题,慎用。

  • 卸载

    dpkg -r demo
    

    删除包,但保留配置文件

    dpkg -P|--purge my-deb
    

    删除包和配置文件

  • 解包

    dpkg --unpack demo.deb
    
  • 查看deb包是否安装/deb包的信息

    dpkg -s demo
    
  • 查看deb包文件内容

    dpkg -c demo.deb
    
  • 解压deb中所要安装的文件

    dpkg -x  demo.deb demo
    

    第一个参数为所要解压的deb包,第二个参数为将deb包解压到指定的目录

  • 解压deb包中DEBIAN目录下的文件(至少包含control文件)

    dpkg -e demo.deb demo/DEBIAN
    
  • 列出与该包关联的文件

    dpkg -L demo
    
  • 配置软件包

    dpkg --configure demo
    
posted @ 2022-03-11 13:29  zwbsoft  阅读(581)  评论(0编辑  收藏  举报