本文主要演示從帶二進制源碼打出符合UOS商店規范的deb包
商店打包規范請參考uos官網文檔
參考鏈接:
第一步,配置好環境變量值
環境變量值 在家目錄下的.bashrc(如果你使用的bash shell)文件中加入如下三行,根據個人信息替換
我使用的zsh 所以在.zshrc文件下配置
➜ ~ head -n 3 .zshrc DEBFULLNAME="liuyong" DEBEMAIL="liuyong@deepin.com" export DEBFULLNAME DEBEMAIL
構建deb包可分為從源碼編譯構建和從二進制包直接構建,二進制包已有編譯好的二進制程序,可直接運行,無需再編譯,直接構建成deb包即可,本文講從二進制包構建deb包
本文的實例包為jetbrains公司的IDE -- Clion Clion下載地址
下載完后,接下來我們來將他構建為一個deb包
-
首先創建一個用來構建deb包的目錄,目錄要以 包名-版本號 的格式
➜ ~ mkdir -p clion/com.jetbrains.clion-2019.3.5 -
接下來構建一個規范的軟件目錄,用來按規則放其他的文件,完整的目錄結構為:
➜ ~ cd clion/com.jetbrains.clion-2019.3.5 ➜ com.jetbrains.clion-2019.3.5 tree com.jetbrains.clion com.jetbrains.clion #此目錄以包名命名 ├── entries #此目錄必須有 │ ├── applications #放desktop文件,gui界面應用必須要有此目錄和desktop文件 │ ├── autostart #放自啟動入口文件 │ ├── GConf #gseetings文件 │ ├── glib-2.0 #schame文件 │ ├── icons #應用的圖標文件,根據大小放進不同的目錄下的apps/目錄下,支持的分辨率包括:16/24/32/48/128/256/512,svg格式的放在scalable/apps/目錄下,gui界面應用必須要有 │ │ └── hicolor │ │ ├── 16x16 │ │ │ └── apps │ │ ├── 24x24 │ │ │ └── apps │ │ ├── 32x32 │ │ │ └── apps │ │ ├── 48x48 │ │ │ └── apps │ │ ├── 128x128 │ │ │ └── apps │ │ ├── 256x256 │ │ │ └── apps │ │ ├── 512x512 │ │ │ └── apps │ │ └── scalable │ │ └── apps │ ├── locale #語言包目錄 │ ├── plugins #插件目錄 │ └── services #dbus服務目錄 │ └── help #各種語言的幫助文檔 ├── files #放其他文件 此目錄必須有 └── info #json格式的應用信息,info文件必須有 23 directories, 1 file將二進制包解壓,並將對應的文件放入相應的位置
➜ com.jetbrains.clion tar -xvzf ~/Downloads/CLion-2019.3.5.tar.gz ➜ com.jetbrains.clion ls clion-2019.3.5 entries files info ➜ com.jetbrains.clion cp clion-2019.3.5/bin/clion.svg entries/icons/hicolor/scalable/apps #svg圖標按照規則放這個目錄 ➜ com.jetbrains.clion cp clion-2019.3.5/bin/clion.png entries/icons/hicolor/128x128/apps #png格式按照尺寸放 ➜ com.jetbrains.clion mv clion-2019.3.5/* files #其他文件放files目錄 ➜ com.jetbrains.clion rmdir clion-2019.3.5 ➜ com.jetbrains.clion ls files bin build.txt help Install-Linux-tar.txt jbr lib license plugins product-info.json -
寫一個規范的info文件
info文件是應用的描述文件,使用
json格式,完整的info文件格式如下:{ "appid": "com.deepin.demo", "name": "Demo", "version": "5.0.0.0", "arch": ["amd64", "mips64"], "permissions": { "autostart": false, "notification": false, "trayicon": false, "clipboard": false, "account": false, "bluetooth": false, "camera": false, "audio_record": false, "installed_apps": false }, "support-plugins": [ "plugin/demo" ], "plugins": [ "plugin/webbrowser", "plugin/office" ] }info文件中各個字段的說明如下:
appid:應用標識
name:應用名稱
version:應用版本,格式為 {MAJOR}.{MINOR}.{PATCH}.{BUILD},所有版本號均為純數字
arch:應用支持架構,當前商店支持如下CPU架構
- amd64:x86架構CPU - mips64:龍芯系列CPU - arm64:ARM64位CPU - sw_64:申威CPUpermissions:應用權限描述。
- autostart:是否允許自啟動 - notification:是否允許使用通知 - trayicon:是否運行顯示托盤圖標 - clipboard:是否允許使用剪切板 - account:是否允許讀取登錄用戶信息 - bluetooth:是否允許使用藍牙設備 - camera:是否允許使用視頻設備 - audio_record:是否允許進行錄音 - installed_apps:是否允許讀取安裝軟件列表support-plugins: 支持的插件類型
plugins:實現的的插件類型,在對應的plugins目錄下,按照實現的插件類型放置文件。
在安裝時,系統會將插件鏈接到對應的應用目錄。
本軟件info內容參考如下:
➜ com.jetbrains.clion cat info { "appid": "com.jetbrains.clion", "name": "CLion", "version": "2019.3.5", "arch": ["amd64"], "permissions": { "autostart": false, "notification": false, "trayicon": false, "clipboard": false, "account": false, "bluetooth": false, "camera": false, "audio_record": false, "installed_apps": false } } -
寫一個desktop文件以包名.desktop為格式,本包寫好的文件格式如下
desktop文件必須要以包名命名(類似com.foxit.foxitpdfeditor)
➜ com.jetbrains.clion vim entries/applications/com.jetbrains.clion.desktop ➜ com.jetbrains.clion cat entries/applications/com.jetbrains.clion.desktop [Desktop Entry] Name=CLion Comment=The Drive to Develop Exec=/opt/apps/com.jetbrains.clion/files/bin/clion.sh Icon=clion Terminal=false Categories=Development Type=Applicationdesktop官方文檔
desktop語法解釋
[Desktop Entry] 文件頭
Name 應用名稱
Comment 軟件描述信息
Exec 軟件的可執行文件(可以是二進制或者腳本)
Icon 圖標名
Terminal 是否使用終端
Type 啟動器類型
Categories 應用的類型 可用的字段參考
-
接下來,回到上層目錄,使用 dh_make --createorig -s 命令創建debian目錄,並在上層目錄初始化出來源碼包
➜ com.jetbrains.clion-2019.3.5 dh_make --createorig -s Maintainer Name : liuyong Email-Address : liuyong@deepin.com Date : Wed, 25 Mar 2020 14:27:06 +0800 Package Name : com.jetbrains.clion Version : 2019.3.5 License : blank Package Type : single Are the details correct? [Y/n/q]確認信息無誤輸入y即可
上層目錄會生成一個xxx.orig.tar.xz的壓縮包,一定要讓壓縮包生成,否則后續命令會錯誤
當前目錄下會自動創建debian目錄,目錄下有很多打包使用的模板文件,以.ex/.EX結尾,具體用途參考 模板文件參考,對於此軟件包,我們不需要這些模板文件,所以全部刪掉
➜ com.jetbrains.clion-2019.3.5 ls com.jetbrains.clion debian ➜ com.jetbrains.clion-2019.3.5 ls debian changelog control menu.ex README.Debian com.jetbrains.clion.cron.d.ex copyright postinst.ex README.source com.jetbrains.clion.doc-base.EX manpage.1.ex postrm.ex rules com.jetbrains.clion-docs.docs manpage.sgml.ex preinst.ex source compat manpage.xml.ex prerm.ex watch.ex ➜ com.jetbrains.clion-2019.3.5 rm debian/*.EX debian/*.ex ➜ com.jetbrains.clion-2019.3.5 ls debian changelog compat copyright README.source source com.jetbrains.clion-docs.docs control README.Debian rules然后修改control文件
對各個Control文件的具體描述說明,參考Control文件說明,我們本次打包,只需修改sections字段,homepage字段,Architecture字段,Description字段,修改完后如下格式
➜ com.jetbrains.clion-2019.3.5 vim debian/control ➜ com.jetbrains.clion-2019.3.5 cat debian/control Source: com.jetbrains.clion Section: devel Priority: optional Maintainer: liuyong <liuyong@deepin.com> Build-Depends: debhelper (>= 11) Standards-Version: 4.1.3 Homepage: http://jetbrains.com #Vcs-Browser: https://salsa.debian.org/debian/com.jetbrains.clion #Vcs-Git: https://salsa.debian.org/debian/com.jetbrains.clion.git Package: com.jetbrains.clion Architecture: amd64 Depends: ${shlibs:Depends}, ${misc:Depends} Description: C/C++ smart IDE <insert long description, indented with spaces>本次修改的幾個字段解釋
sections 為軟件分類,字段值參考 sections字段值參考
homepage 軟件的主頁的網址
Architecture 支持的架構,因為該二進制為64位,所以只用寫amd64
descriptions 軟件的描述信息
接下來在debian目錄創建install文件,install文件可以指定各個文件的安裝路徑,官方文檔 本包的install文件參考:
➜ com.jetbrains.clion-2019.3.5 vim debian/install ➜ com.jetbrains.clion-2019.3.5 cat debian/install com.jetbrains.clion/ /opt/apps
因為是從二進制包構建的,不用編譯和生成共享庫等行為,所以我們可以在rules文件里覆蓋掉這些指令,讓他什么都不做,本包的rules文件參考如下:(出了標注出來的行,其他為默認生成) debian官方文檔
➜ com.jetbrains.clion-2019.3.5 cat debian/rules #!/usr/bin/make -f # See debhelper(7) (uncomment to enable) # output every command that modifies files on the build system. export DH_VERBOSE = 1 # see FEATURE AREAS in dpkg-buildflags(1) #export DEB_BUILD_MAINT_OPTIONS = hardening=+all # see ENVIRONMENT in dpkg-buildflags(1) # package maintainers to append CFLAGS #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic # package maintainers to append LDFLAGS #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed #for mutil-arch packages #source_tar = ../ #source_dir = ../ #ifneq ($(DEB_HOST_ARCH),amd64) # source_tar = ../ # source_dir = ../ #endif %: dh $@ override_dh_auto_build: #這是加入的行 override_dh_shlibdeps: #這是加入的行 override_dh_strip: #這是加入的行 # dh_make generated override targets # This is example for Cmake (See https://bugs.debian.org/641051 ) #override_dh_auto_configure: # dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
修改changelog文件文件中的版本號
把版本號 (1.0.0.0-1) 改成 (1.0.0.0),保持與上面info設定的版本號一致,不然系統讀取deb的版本號就變成1.0.0.0-1
執行dpkg-buildpackage命令進行打包
下面的命令可能執行失敗,可以參考在UOS/Deepin給可執行程序打符合應用商店的deb包
接下來執行dpkg-source -b .和 dpkg-buildpackage -us -uc -nc在打出deb包
變更為執行如下命令:
sudo dpkg-buildpackage -tc -uc -us -b
➜ com.jetbrains.clion-2019.3.5 dpkg-source -b . dpkg-source: info: using source format '3.0 (quilt)' dpkg-source: info: building com.jetbrains.clion using existing ./com.jetbrains.clion_2019.3.5.orig.tar.xz dpkg-source: info: building com.jetbrains.clion in com.jetbrains.clion_2019.3.5-1.debian.tar.xz dpkg-source: info: building com.jetbrains.clion in com.jetbrains.clion_2019.3.5-1.dsc ➜ com.jetbrains.clion-2019.3.5 dpkg-buildpackage -us -uc -nc ➜ com.jetbrains.clion-2019.3.5 ls .. com.jetbrains.clion-2019.3.5 com.jetbrains.clion_2019.3.5-1_amd64.buildinfo com.jetbrains.clion_2019.3.5-1_amd64.changes com.jetbrains.clion_2019.3.5-1_amd64.deb com.jetbrains.clion_2019.3.5-1.debian.tar.xz com.jetbrains.clion_2019.3.5-1.dsc com.jetbrains.clion_2019.3.5.orig.tar.xz
核心命令
#將xxxx.deb包解壓至temp目錄下 ➜ fakeroot dpkg-deb -R xxxx.deb temp #處理文件目錄,刪除temp/usr目錄 ➜ rm -rf temp/usr #壓縮包至sign目錄下,包名為yyy.deb ➜ fakeroot dpkg-deb -b temp sign/yyy.deb #檢查包yyy.deb內容中的文件目錄是否全部在/opt/apps/包名這個目錄下 ➜ dpkg-deb -c sign/yyy.deb
但在構建deb包的過程中,包的幫助手冊,以及copyright和changelogs都會在打包過程中安裝到/usr/share/doc目錄下,我們要把這個目錄改裝在entries目錄下,使用fakeroot dpkg-deb -R pkg.deb a 來將名為pkg的deb包解壓到 a 目錄下,doc目錄mv到entries目錄下,然后刪除空的/usr/share/目錄,使用fakeroot dpkg-deb -b a pkg.deb將改好的包格式壓入deb包內,可以使用dpkg-deb -c pkg.deb命令來查看deb包的安裝文件目錄,確定所以文件都安裝在/opt/apps/包名 這個目錄下即可
➜ clion fakeroot dpkg-deb -R com.jetbrains.clion_2019.3.5-1_amd64.deb a ➜ clion mv a/usr/share/doc a/opt/apps/com.jetbrains.clion/files ➜ clion rm -rf a/usr ➜ clion fakeroot dpkg-deb -b a com.jetbrains.clion_2019.3.5-1_amd64.deb
然后可以通過dpkg -i測試安裝 ,看軟件包是否可以在啟動器顯示圖標,正常運行即可
