1. 程式人生 > 其它 >Electron整合Java服務端打deb包

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完整內容

    [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