一步步教你在 Windows 上構建 dotnet 系應用的 UOS 軟件安裝包

本文將詳細指導大家如何逐步爲 dotnet 系列應用創建滿足 UOS 統信系統軟件安裝包的要求。在這裏,我們所說的 dotnet 系列應用是指那些能夠在 Linux 平臺上構建 UI 框架的應用,包括但不限於 CPF 應用、UNO 應用、Avalonia 應用等

基於 dotnet 系的自發布自包含的能力,可以將 dotnet 系的應用進行發佈爲獨立應用,無需框架依賴,如此即可執行 deb 包的二進制打包過程,從而很方便對接上 UOS 統信系統軟件安裝包的要求

整體步驟可以分爲三個大步驟:

  • 步驟一:發佈應用
  • 步驟二:組織文件結構
  • 步驟三:打包 deb 文件

本文接下來將按照步驟順序一步步告訴大家如何在 Windows 上爲 dotnet 系的應用創建符合要求的 UOS 統信系統軟件安裝包。本文寫於 2023.12.25 如果你閱讀本文的時間距離編寫時間過遠,可能本文有些知識不正確

步驟一 發佈應用

無論是 CPF 應用還是 UNO 應用或者 Avalonia 應用,在進行構建符合要求的 UOS 軟件安裝包的第一步都是對應用項目進行發佈,且爲了後續打包和分發的方便,十分推薦發佈爲獨立應用。這些應用的大概的發佈命令行如下,請根據你的實際需求進行更改

dotnet publish -c release -r linux-x64 --self-contained true

完成發佈之後,咱即可拿發佈出來的文件夾進行製作符合要求的 UOS 軟件安裝包。爲了減少大家的學習成本,本文將一步步進行,本文在編寫過程中,將會先略去在本文所沒有用到的知識點。但請大家放心的是,按照本文的方法是可以構建出一個符合要求的 UOS 軟件安裝包,只有一些擴展可選部分的功能被本文略過

在進入步驟二之前,我推薦將發佈的文件夾拷貝到 UOS 系統上測試一下,確保應用本身發佈出來是能夠正常運行

步驟二 組織文件結構

本文屬於儘可能多的手動化打包過程,所使用的工具只有文本編輯器以及 WSL (適用於 Linux 的 Windows 子系統) 和 dpkg 工具。本文這裏使用 WSL 僅僅只是爲了使用 dpkg 工具而已,儘量使用官方推薦的打包工具。事實上,咱是完全可以將此過程在 Windows 上完成的。但爲了減少引入額外的工具,本文依然使用 dpkg 工具進行打包,在本文後面,大家可以看到 dpkg 工具的戲份也只有一句話

2.1 準備打包環境

在開始之前,需要先準備好打包環境

  • 文本編輯器
    • 這裏的文本編輯器可不推薦選用 Windows 自帶的記事本哦。因爲 Windows 自帶的記事本絕大部分情況下的默認行爲都會寫入文件的 BOM 頭,導致脆弱的 Linux 不認識而掛掉。如果一定要用 Windows 自帶的記事本工具,記得保存選項裏面選用的是 UTF-8 版本,不能選用 UTF-8 with BOM 等編碼
    • 推薦使用 SublimeText 或 Vim 工具都可以
  • Debian 的 WSL 工具
  • dpkg 工具
    • 默認就在 Debian 裏面帶了,你只需要打開 Debian WSL 命令行,輸入 dpkg 試試看,即可知道安裝了沒。如沒安裝,那隨便網上搜搜就知道怎麼安裝了

爲什麼在 WSL 裏面要選用 Debian 版呢?請自行搜搜 uos 和 debian 關係 你就知道咯

2.2 準備文件結構

開始之前的準備工作完成之後,接下來就可以開始正式的打包大業了。先來明確一下咱的目標:現在咱手頭上有一個 Debian 的 WSL 工具,也有使用 UI 框架的應用進行獨立發佈之後的文件夾,意味着其二進制文件可以直接在 UOS 上雙擊運行。咱需要做的就是將獨立發佈之後的文件夾打進安裝包裏面,再搭配上 UOS 規範要求的圖標、應用信息等即可

根據 應用打包規範 文檔中心-統信UOS生態社區 文檔,咱可以瞭解到符合 UOS 規範要求的安裝包其實也是一個 deb 包。與之不同的只有文件結構組織形式,以及部分配置內容不相同而已

根據 如何構建符合要求的 UOS 軟件安裝包 - VVavE 文檔,可以看到在 UOS 規範下的安裝包的文件結構組織形式如下

│  
├─DEBIAN
│      control
│      
└─opt
    └─apps
        └─org.dotnetcampust.exampleapplication
            │  info
            │  
            ├─entries
            │  ├─applications
            │  │      org.dotnetcampust.exampleapplication.desktop
            │  │      
            │  └─icons
            │      └─hicolor
            │          └─24x24
            │              └─apps
            │                      org.dotnetcampust.exampleapplication.png
            │                      
            └─files
                └─bin
                    │  ExampleApplication
                    │  ExampleApplication.deps.json
                    │  ExampleApplication.dll
                    │  ExampleApplication.pdb
                    │  ExampleApplication.runtimeconfig.json
                    │  ExampleApplication.uprimarker
                    │  WindowsBase.dll
                    │  Microsoft.CSharp.dll
                    │  ...

再次感謝 VVavE 潮汐博客 本文接下來將有大量知識內容來源於此

本文接下來將按照文件夾組織的順序,告訴大家如何進行組織

2.2.1 DEBIAN 文件夾

安裝包的文件結構組織的根目錄包含了 DEBIANopt 兩個文件夾。其中的 DEBIAN/ 文件夾是構建過程文件夾,包含軟件包構建過程相關的控制文件。在本文這裏,只需放入 control 構建控制文件即可,此文件完全遵照 Debian 官方規範

爲了方便大家理解,本文將對 UnoFileDownloader 下載器 進行打包作爲例子,方便大家瞭解手動打包的細節

在開始製作安裝包的時候,咱還需要給應用進行命名,即對 AppID 應用的唯一標識進行命名。在 UOS 裏採用和 Android 系統類似的規範,應用商店只接受使用域名倒置規則命名的應用。請務必使用廠商的倒置域名+產品名作爲應用包名,如 com.example.demo 格式,前半部分爲廠商域名倒置,後半部分爲產品名,如果使用非擁有者的域名作爲前綴,可能會引起該域名擁有者進行申訴,導致軟件被申訴下架或者刪除

這裏必須特別強調,只允許小寫字母。且在本文下方出現的任何 AppIDappid${appid} 等佔位符裏,都需要採用此應用的唯一標識字符串,請務必確保手工打包時,各處命名都是使用相同的字符串

本文這裏對 UnoFileDownloader 下載器 命名爲 org.dotnetcampust.unofiledownloader 應用。儘管看起來有些不習慣且可讀性較差,但 UOS 官方規範就是這樣,只有遵守咯

先創建工作文件夾,接下來咱的所有文件組織結構都在此工作文件夾進行。如我這裏創建的是 C:\lindexi\Work 文件夾

在工作文件夾裏面先創建 DEBIAN 文件夾,請確保大小寫哦,在 Linux 上是大小寫敏感的

進入 DEBIAN 文件夾,再創建名爲 control 的文本文件。接着打開文本編輯器,編輯 control 文件。此 control 文件要求使用 UTF-8 格式編碼,且是不帶 BOM 頭的。所謂 BOM 頭就是在文件的前兩個字節裏面寫入編碼信息,這是在 Windows 上常用的方式,原本 BOM 頭是用來指示編碼大小端的,後續被大家更開森用在了識別區分文件的編碼上了。使用 SublimteText 編輯時,默認的配置就是不帶 BOM 頭的

按照 Debian 的規範,編寫 control 的文件的內容,如以下例子

Package: org.dotnetcampust.unofiledownloader
Version: 1.1.3
Section: utils
Priority: optional
Architecture: amd64
Multi-Arch: foreign
Build-Depends: debhelper (>=9)
Standards-Version: 3.9.6
Maintainer: lindexi<[email protected]>
Homepage: https://blog.lindexi.com/
Description: 下載器.

以上的 control 的各個字段/屬性的說明如下,以下內容來自於 從零開始製作 deb 文件 - hzSomthing 博客

  • Package : 包的唯一標識符,即 AppID 值
  • Version : 安裝包的版本號,即應用版本號。可使用 a.b.c 格式,也可以比較複雜的語義版本號格式,如 1.2.3-2+b1 等格式
  • Section : 這是軟件包的分類子類別,可以選用 utils,admin, devel, doc, libs, net, 或者 unknown 等等,代表着該軟件包在 Debian 倉庫中將被歸屬到什麼樣的邏輯子分類中
  • Priority : optional 優先級適用於與優先級爲 required、important 或 standard 的軟件包不衝突的新軟件包。也可以做其它取值。若是不明瞭,請使用 optional
  • Architecture : 目標系統的 CPU 架構,一般來說是 amd64,具體情況以後會有所討論。有時候,它們可以是 any 或者 all
  • Maintainer : deb 包的維護者,及其郵件地址
  • Description : 軟件包的描述信息。多行也可以,前面縮進至少一個空格
  • 最後一個空行 : 不能省略,否則打包提示 missing final newline 錯誤

DEBIAN/ 文件夾裏面還可以包含其他的很多文件,只是本例子這裏沒有需求用到,就此略過。如感興趣,請參閱 Debian 新維護者手冊

2.2.2 opt 文件夾

完成 control 文件編寫之後,接下來創建 /opt/apps/${appid}/ 文件夾,請將 ${appid} 替換爲你的 AppID 值,此文件夾就是應用根目錄文件夾

在本文這裏也就是創建 C:\lindexi\Work\opt\apps\org.dotnetcampust.unofiledownloader\ 文件夾,請特別小心文件命名的小寫問題

應用根目錄下面應包含 filesentries 兩個目錄和一個 info 文件。文件結構如下

│ 
│      
└─opt
    └─apps
        └─org.dotnetcampust.exampleapplication
            │  info
            │  
            ├─entries
            │  ├─applications
            │  │      org.dotnetcampust.exampleapplication.desktop
            │  │      
            │  └─icons
            │      └─hicolor
            │          └─24x24
            │              └─apps
            │                      org.dotnetcampust.exampleapplication.png
            │                      
            └─files
                └─bin
                    │  UnoFileDownloader.Skia.Gtk
                    │  ...

以下繼續按照此順序逐個爲大家介紹

2.2.2.1 files 文件夾

先創建 files 文件夾,按照規範上所述,可以在 files 文件夾裏面塞入任意的文件,也包括應用的可執行文件。規範上建議將可執行文件放入到 files/bin 文件夾,咱是聽話的開發者,於是將 dotnet publish -c release -r linux-x64 --self-contained true 的輸出文件夾(我的是 X:\lindexi\Code\dotnetCampus.FileDownloader\src\UnoFileDownloader\UnoFileDownloader\UnoFileDownloader.Skia.Gtk\bin\Release\net8.0\linux-x64\publish\ 文件夾)的文件全部拷貝(移動)到 files/bin 文件夾裏面

2.2.2.2 entries 文件夾

再創建 entries 文件夾,在 entries 文件夾裏面應該放入的內容是桌面/開始菜單的圖標以及應用啓動信息。在 entries 文件夾裏面再創建 applications 文件夾,在 applications 文件夾裏面創建 AppId.desktop 文本文件。同理請將 AppId.desktop 的 AppId 換成你的應用標識符,在本文例子裏面,將創建的是 C:\lindexi\Work\opt\apps\org.dotnetcampust.unofiledownloader\entries\applications\org.dotnetcampust.unofiledownloader.desktop 文件

接下來打開文本編輯器,編輯 .desktop 文本文件,同理要求此文件採用 UTF-8 編碼格式。以下是 org.dotnetcampust.unofiledownloader.desktop 文件例子內容,此文件當前使用的是標準的 desktop 格式,相關標準及其他字段可以參考 https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.1.html 文檔或 desktop文件規範 - DeepinWiki 文檔

[Desktop Entry] 
Categories=Network
Name=UnoFileDownloader
Name[zh_CN]=簡單的下載器
Keywords=deepin;uniontech;downloader
Keywords[zh_CN]=深度;統信;下載器
Comment=The UnoFileDownloader can download file.
Comment[zh_CN]=可以簡單下載文件。
Exec=/opt/apps/org.dotnetcampust.unofiledownloader/files/bin/UnoFileDownloader.Skia.Gtk
Icon=org.dotnetcampust.unofiledownloader
Type=Application
Terminal=false
StartupNotify=true
MimeType=audio/aac;application/aac;

以下是從官方文檔 裏抄到的 Desktop 文件中重點字段的解釋

  • [Desktop Entry]: 必填 desktop文件標識,標準格式,不需要改動。
  • Categories: 選填 程序分類,用於標註程序所屬類型。該字段不存在時,應用屬於“其他應用”。
  • Name: 必填 程序在啓動器中顯示的通用名稱,在沒有單獨設置語言參數的情況下,默認顯示該名稱。
  • Keywords: 選填 程序的通用關鍵搜索詞,當在啓動器中搜索該詞而非程序名稱時,即可索引出該程序的快捷方式。
  • Comment: 選填 關於本程序的通用簡述,在沒有單獨設置語言參數的情況下,默認顯示該段內容。
  • Exec: 必填 應用的運行程序所在路徑,一般爲程序的可執行二進制文件或啓動腳本,後期會被沙箱啓動。 填寫時需要關注路徑的有效性,如果路徑無效,在安裝該程序後,程序快捷方式將不會顯示在啓動器中。一般都是 /opt/apps/${appid}/files/bin/Xxxxx 文件路徑,這個路徑請關注一下文件命名大小寫問題,防止因爲大小寫不相同導致路徑文件找不到,請將 Xxxxx 替換爲你的構建輸出的可執行程序
  • Icon : 必填 顯示的圖標所在路徑,推薦使用相對名稱以便於系統根據主題規範查找對應的圖標文件,特殊情況下(顯示異常等)需要使用絕對路徑來獲取圖標。按照圖標命名的約定,基本上這裏填寫的就是 ${appid} 的值,不需要帶上圖片後綴名
  • Type: 必填 程序類型,必須爲“Application”。
  • Terminal : 必填 該字段決定程序是否以終端的形式運行,默認爲“false”關閉狀態,若該項爲“true”開啓狀態,則應用將會在終端中打開。即設置爲 true 時,將以命令行控制檯方式啓動
  • StartupNotify: 必填 程序是否支持發送啓動通知事件。爲“true”時,允許桌面環境跟蹤應用程序的啓動,提供用戶反饋和其他功能。例如鼠標的等待動畫等。爲保障應用使用體驗,該項建議填寫“true”。
  • MimeType : 選填 程序支持的關聯文件類型,根據實際需求來填寫。如果沒有需要支持關聯文件,則可以整行不寫

Categories 應用類型可參考以下填寫值來設置

  • Network: 網絡應用
  • Chat: 社交溝通
  • Audio: 音樂欣賞
  • AudioVideo: 視頻播放
  • Graphics: 圖形圖像
  • Game: 遊戲娛樂
  • Office: 辦公學習
  • Reading: 閱讀翻譯
  • Development: 編程開發
  • System: 系統管理

除上述分類外,填寫其他分類將會被歸爲“其他應用”

完成 .desktop 文本文件,接下來再創建 icons 文件夾用來存放應用圖標。圖標可以使用 svg 矢量格式和 png 非矢量格式。儘管官方文檔說的是非矢量格式建議使用 png 格式,然而實際是只能使用png格式,我試過 jpg 等其他格式都不生效,都會被替換爲默認的應用圖標,將 jpg 改後綴爲 png 也是不行的

矢量格式圖標只需放一份,路徑是 entries/icons/hicolor/scalable/apps/${appid}.svg 請在放入圖標之後,拷貝其路徑與本文檔進行對比,看是否文件夾層級正確

如果使用非矢量格式,請按照 分辨率 來放置圖標,如:

entries/icons/hicolor/24x24/apps/${appid}.png
entries/icons/hicolor/16x16/apps/${appid}.png
  • 支持的分辨率包括: 16/24/32/48/128/256/512 ,不同分辨率的圖標會被用在不同的地方,比如桌面、通知欄、任務欄、應用抽屜中,如果沒有全部包括則會自動進行縮放,影響最終效果
  • 強烈建議遵循分辨率放置目錄,儘量不要在 128x128 文件夾內放置其他分辨率的圖標
  • 如果實在沒有其他分辨率資源,只有一個分辨率圖標,放置在 128x128 文件夾即可

同樣,在放入圖標之後,請拷貝其路徑與本文檔進行對比。我在製作安裝包時,就因爲少了一層 hicolor 文件夾,調查了半天才發現是文件夾層級不對

2.2.2.3 info 文件

完成應用根目錄下面包含的 entriesfiles 兩個目錄之後,接下來開始編寫 info 文件。此文件是應用的描述文件,用於dde桌面環境安裝軟件包時自動配置程序的安裝文件,使用 JSON 格式,內容一般如下

{
	"appid": "org.dotnetcampust.unofiledownloader",
	"name": "UnoFileDownloader",
	"version": "1.1.3",
	"arch": ["amd64", "arm64"],
	"permissions": 
	{
		"autostart": false,
		"notification": false,
		"trayicon": false,
		"clipboard": false,
		"account": false,
		"bluetooth": false,
		"camera": false,
		"audio_record": false,
		"installed_apps": false
	}
}
  • appid : 填入的就是 ${appid} 內容,作爲應用標識,軟件包名

  • name :應用默認名稱,允許和其他應用重名

  • version :應用版本,使用 {MAJOR}.{MINOR}.{PATCH}.{BUILD} 格式,即 [主線版本].[次要版本].[補丁版本].[構建版本] 格式,所有版本號均爲純數字。此處填寫的值應與deb安裝包所標識的版本號一致,即和 DEBIAN/control 的 Version 相同

  • arch :應用支持的架構,目前商店支持以下幾種架構 amd64, mips64el, arm64, sw_64, loongarch64

  • permissions :應用權限。開發者需要注意,應用只允許使用普通用戶權限啓動,禁止應用以任何形式 root 提權。此部分只限制通過 Dbus 調用,其他方式調用則無影響。具體含義如下

  • autostart : 是否允許自啓動

  • notification : 是否允許使用通知

  • trayicon : 是否運行顯示托盤圖標

  • clipboard : 是否允許使用剪切板

  • account : 是否允許讀取登錄用戶信息

  • bluetooth : 是否允許使用藍牙設備

  • camera : 是否允許使用視頻設備

  • audio_record : 是否允許進行錄音

  • installed_apps : 是否允許讀取安裝軟件列表

這裏需要額外提醒大家,在 UOS 的官方文檔提供的 info 文件例子裏面,其文件內容的 json 格式是錯誤的,在 permissions 屬性和下一個屬性之間少了一個逗號,如果想要拷貝官方的例子,還請自行確保 json 格式正確

寫到這裏,文件結構就完成了,本例子完成之後的文件結構如下

C:\lindexi\Work
│ 
│  
├─DEBIAN
│      control
│      
└─opt
    └─apps
        └─org.dotnetcampust.unofiledownloader
            │  info
            │  
            ├─entries
            │  ├─applications
            │  │      org.dotnetcampust.unofiledownloader.desktop
            │  │      
            │  └─icons
            │      └─hicolor
            │          └─24x24
            │              └─apps
            │                      org.dotnetcampust.unofiledownloader.png
            │                      
            └─files
                └─bin
                    │  UnoFileDownloader.dll
                    │  UnoFileDownloader.pdb
                    │  UnoFileDownloader.Skia.Gtk
                    │  UnoFileDownloader.Skia.Gtk.deps.json
                    │  UnoFileDownloader.Skia.Gtk.dll
                    │  UnoFileDownloader.Skia.Gtk.pdb
                    │  UnoFileDownloader.Skia.Gtk.runtimeconfig.json
                    │  UnoFileDownloader.uprimarker
                    │  WindowsBase.dll
                    │  Microsoft.CSharp.dll
                    │  ...

完成了文件結構,下面將進入打包環境,開始創建 deb 包

步驟三 打包 deb 文件

本例子打包採用的是 Debian 的 WSL 裏的 dpkg 工具進行創建 deb 文件,開始之前請確保準備好 Debian 環境。下載地址:https://www.microsoft.com/store/productId/9MSVKQC78PK6?ocid=pdpshare

先使用 cd 命令進入工作路徑,如本文例子使用的 C:\lindexi\Work 文件夾

cd /mnt/c/lindexi/Work

進入其他盤符請使用 /mnt/[盤符] 的方式。值得一提的是 WSL 裏面對中文支持還不錯,可以放心進入中文文件夾

進入之後使用 ls 命令確保進入正確的文件夾,預期輸出如下

lindexi@DESKTOP-51A5UGG:/mnt/c/lindexi/Work$ ls
DEBIAN  opt

接下來輸入 dpkg-deb -b . 命令進行打包

lindexi@DESKTOP-51A5UGG:/mnt/c/lindexi/Work$ dpkg-deb -b . UnoFileDownloader.deb
dpkg-deb: building package 'org.dotnetcampust.unofiledownloader' in 'UnoFileDownloader.deb'.

如此拿到的 UnoFileDownloader.deb 包就是可在 UOS 上使用的安裝包文件

文件權限

在 WSL 裏面 dpkg-deb 打包時,如果和我一樣採用的是掛載某個磁盤路徑,且磁盤是 NTFS 格式時,可能會遇到如下錯誤提示

dpkg-deb: error: control directory has bad permissions 777 (must be >=0755 and <=0775)

以上錯誤提示即使使用 chmod -R 0755 DEBIAN/controlchmod -R 0755 DEBIAN 命令也是沒有用的。因爲 wsl 如果進入的是 mnt 的 NTFS 磁盤格式下,是無法通過 chmod 設置 0755 權限的,詳細請參閱 https://www.askingbox.com/question/error-message-dpkg-deb-error-control-directory-has-bad-permissions-777

For NTFS drives, this value defaults to 000, which equates to the rights of 777 and is too much here. Therefore, we change the value to umask=022, which equals the right of 755.

解決方法是在 WSL 配置裏面,設置 umask=22 從而將權限轉換爲 755 的方式,具體步驟如下

進入 Debian 命令行,先提權,再創建或編輯 /etc/wsl.conf 文件

lindexi@DESKTOP-51A5UGG: sudo su
lindexi@DESKTOP-51A5UGG: vi /etc/wsl.conf

/etc/wsl.conf 文件配置 umask=22 的值,完成配置之後的文件內容大概如下,如果本身就不存在 /etc/wsl.conf 文件,則可以完全替換爲下面內容,詳細請參閱 https://unix.stackexchange.com/questions/252244/dpkg-deb-error-control-directory-has-bad-permissions

[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=11"
mountFsTab = false

配置完成之後,需要重啓 WSL 才能生效。重啓 WSL 需要使用命令行(新開一個終端)輸入 wsl --shutdown 命令進行關閉,隨後再啓動 Debian 命令行即可完成重啓

這裏請不要使用網上亂抄的關閉 LxssManager 服務的方法

或者保險一些,自己重啓電腦也可以

重啓完成之後,再輸入 dpkg-deb -b . 命令進行打包

簽名

通過以上步驟構建所拿到的 deb 包是還沒帶簽名的,想要進行簽名,請參閱 開發者調試簽名 文檔中心-統信UOS生態社區

簽名步驟需要進入到 UOS 系統上進行,對於開發環境來說,即使沒有簽名的 deb 包也是可以安裝的。也就是簽名這一步是可選的

在開始簽名之前,請到 https://www.chinauos.com/ 註冊開發者賬號

接着打開統信應用商店,搜索“證書工具”,安裝證書工具

安裝完成之後,進入 UOS 的命令行,可使用快捷鍵 ctrl+alt+T 進入,輸入 cert-tool -username="UOS帳號" -password="UOS密碼" 進行初始化,如下面命令行

cert-tool -username=lindexi -password=123123123

完成初始化之後接下來即可對未簽名的 deb 包進行簽名,命令行格式如下

deepin-elf-sign-deb [deb-file]

請將 [deb-file] 替換爲要簽名的deb包路徑

如本文例子的命令行如下

deepin-elf-sign-deb UnoFileDownloader.deb

輸入之後慢慢等簽名,最後看到一句成功的警告就是完成簽名了

Signed successfully!

簽名完成的 deb 包將會放在待簽名的 deb 包目錄下創建 signed_deb 目錄裏面,咱可以進入此 signed_deb 文件夾看一下簽名完成之後的 deb 文件

爲了確保簽名已經成功,可以使用 deepin-deb-verify 命令驗證簽名

先使用 cd 命令進入到 signed_deb 文件夾,再使用如下格式命令驗證簽名

deepin-deb-verify [簽名的 deb 包]

請將 [簽名的 deb 包] 替換爲你實際的 deb 包,在本例子裏面輸入的是以下命令

deepin-deb-verify UnoFileDownloader.deb

如輸出 [INFO] signature verified! 就是證明簽名成功了

接下來可以試試雙擊此簽名完成的 deb 進行安裝

常見問題

dpkg 提示 missing final newline 錯誤

原因是 /DEBIAN/control 文件裏面最後一行少了空行

dpkg 提示 missing 'Package' field 錯誤

可能是編輯 /DEBIAN/control 文件時,編輯器寫入 BOM 頭

可以使用二進制查看器,看一下 /DEBIAN/control 文件開頭兩個字節是否 BOM 頭,如 EF BB BF 開頭就是 UTF-8 BOM 頭。詳細關於 BOM 頭,請看 BOM(字節順序標記(ByteOrderMark))_百度百科

解決方法是換個文本編輯器或手動幹掉 BOM 信息

dpkg 提示 No such file or directory 錯誤

詳細錯誤信息是

dpkg-deb: error: failed to open package info file '/DEBIAN/control' for reading: No such file or directory

請確保進入了正確的文件夾,工作路徑正確

開始菜單圖標空白或是默認應用圖標

原因是圖標文件錯誤,或者是文件路徑錯誤

比如我少了一層 hicolor 文件夾,以及將 512x512 寫成 512*512 文件夾

推薦放入圖標之後,拷貝路徑和本文檔進行對比,瞭解是否放錯文件夾

確保圖標文件的格式在非矢量格式下使用 .png 格式,無論是後綴名還是圖片格式本身,特別是從網上下載的圖標。如不確定的話,可使用 MediaInfo 或 Windows 自帶圖片查看工具瞭解其文件格式

矢量 svg 圖標請確保 svg 使用的是簡單的格式,而不是超級複雜的 svg 格式

應用啓動閃退

打包之前,推薦先將發佈的輸出文件夾拷貝到 UOS 上測試運行情況,先確保發佈二進制文件本身可以正常運行

如二進制本身可以運行但開始菜單點擊無法啓動或無法找到安裝的應用,請檢查 info 文件格式、字段以及字段值的內容是否符合要求,以及 desktop 文件是否正確

打開控制檯調試

如果期望在打包之後運行安裝的應用程序進行調試,要看到輸出控制檯,可以在打包過程中編輯 .desktop 文本文件,設置 Terminal 爲 true 的值。如此將會在啓動程序時顯示控制檯

自動化工具

請參閱 Packaging.DebUOS 專門爲 dotnet 應用製作 UOS 安裝包

如果有其他不明白的,還請加入 810052083 羣進行交流

更多國產軟件開發請參閱 博客導航

參考文檔

How to Create a Simple Debian Package - Baeldung on Linux

如何製作「deb檔(Debian Package)」 Ubuntu Basic Skill

A Unix Packager For MS-Windows Systems - Microsoft Windows Packager

從零開始製作 deb 文件 - hzSomthing

https://www.debian.org/doc/manuals/maint-guide/

如何構建符合要求的 UOS 軟件安裝包 - VVavE

mass1ve-err0r/wpkg: A kinda dpkg-deb for Windows 沒有用

kuiperzone/PupNet-Deploy: PupNet Deploy is a cross-platform deployment utility which packages your .NET project as a ready-to-ship installation file in a single step.

quamotion/dotnet-packaging: Extensions for the .NET Core CLI which help packaging and publishing .NET Core applications

應用打包規範 文檔中心-統信UOS生態社區

源碼打包爲deb文檔中心-統信UOS生態社區

公網deb包轉uos的deb包 文檔中心-統信UOS生態社區 uos打包——公網deb包轉uos的deb包-CSDN博客

開發者調試簽名 文檔中心-統信UOS生態社區

安裝 WSL 的 Debian 系統

https://www.askingbox.com/question/error-message-dpkg-deb-error-control-directory-has-bad-permissions-777

https://unix.stackexchange.com/questions/252244/dpkg-deb-error-control-directory-has-bad-permissions

Automatically Configuring WSL - Windows Command Line

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章