以demo软件为例,project_uos完整目录结构如下:
├── DEBIAN
│ └── control
├── etc
│ └── udev
│ └── rules.d
│ └── ttyusb.rules
├── lib
│ └── x86_64-linux-gnu
│ └── libQt5SerialPort.so.5
└── opt
└── apps
└── com.demo.tempcardprint
├── entries
│ ├── applications
│ │ └── TempCardPrint.desktop
│ └── icons
│ └── hicolor
│ └── 48x48
│ └── apps
│ └── com.demo.tempcardprint.png
├── files
│ └── bin
│ ├── config.ini
│ ├── copylib.sh
│ ├── libbsd.so.0
│ ├── libc.so.6
│ ├── libdl.so.2
│ ├── libdouble-conversion.so.1
│ ├── libfreetype.so.6
│ ├── libgcc_s.so.1
│ ├── libGLdispatch.so.0
│ ├── libglib-2.0.so.0
│ ├── libGL.so.1
│ ├── libGLX.so.0
│ ├── libgraphite2.so.3
│ ├── libharfbuzz.so.0
│ ├── libicudata.so.63
│ ├── libicui18n.so.63
│ ├── libicuuc.so.63
│ ├── libm.so.6
│ ├── libpcre2-16.so.0
│ ├── libpcre.so.3
│ ├── libpng16.so.16
│ ├── libpthread.so.0
│ ├── libQt5Core.so.5
│ ├── libQt5Gui.so.5
│ ├── libQt5PrintSupport.so.5
│ ├── libQt5SerialPort.so.5
│ ├── libQt5Test.so.5
│ ├── libQt5Widgets.so.5
│ ├── librt.so.1
│ ├── libstdc++.so.6
│ ├── libudev.so.1
│ ├── libX11.so.6
│ ├── libXau.so.6
│ ├── libxcb.so.1
│ ├── libXdmcp.so.6
│ ├── libXext.so.6
│ ├── libz.so.1
│ ├── pack.sh
│ ├── platforms
│ │ └── libqxcb.so
│ ├── TempCardPrint
│ └── TempCardPrint.sh
└── info
首先在project_uos下新建如下目录
在DEBIAN目录下新建control文件,输入命令touch control,文件写入如下内容
Package: com.demo.tempcardprint
Version: 1.0.0
Architecture: amd64
Maintainer: tempcardprint
Description: tempcardprint project
etc目录为配置udev规则,由于需要操作串口,需要开权限,etc/udev/rules.d/ttyusb.rules文件内容如下:
SUBSYSTEM=="tty",KERNEL=="tty*",OWNER="guest",MODE="0666"
lib目录放一些程序需要的库环境,这里在/lib/x86_64-linux-gnu/中放入libQt5SerialPort.so.5文件
opt/apps/com.demo.tempcardprint目录下结构如下
其中info文件内容如下:
{
"appid": "com.demo.tempcardprint",
"name": "tempcardprint",
"version": "1.0.0.0",
"arch": ["amd64"],
"permissions": {
"autostart": false,
"notification": false,
"trayicon": false,
"clipboard": false,
"account": false,
"bluetooth": false,
"camera": false,
"audio_record": false,
"installed_apps": false
}
}
entries目录新建applications和icons目录,applications新建tempcardprint.desktop文件,内容如下
[Desktop Entry]
Categories=Audio;AudioVideo;Qt;
Exec=/opt/apps/com.demo.tempcardprint/files/bin/TempCardPrint.sh
GenericName=com.demo.tempcardprint
Icon=/opt/apps/com.demo.tempcardprint/entries/icons/hicolor/48x48/apps/com.demo.tempcardprint.png
MimeType=audio/aac;application/aac;
Name=tempcardprint
Type=Application
X-Deepin-Vendor=user-custom
icons目录放程序logo,路径为icons/hicolor/48x48/apps/com.demo.tempcardprint.png
files/bin目录为程序运行目录,运行环境都放在这个目录。
返回project_uos目录,所有打包文件都必须是root权限,输入如下命令赋予root权限(这一步可以不要,详见“打包文件权限的一些说明”)
//这句忽略,改变用户组的,把project_uos的用户名和用户组改成root和root
//sudo chown -R root:root project_uos/
//修改某个目录或文件的访问权限
chmod -R 755 project_uos/
输入命令打包deb
sudo dpkg-deb --root-owner-group -b project_uos/ xxx.deb
打包文件权限的一些说明
安装包里的文件权限是755
1、查看权限
Linux文件访问权限分为可读,可写和可执行三种。
可用ls -l命令查看,例:ls -l
显示-rwxr-xr-x 1 root root 6444 09-22 15:33 shmwrite
-rw-r--r-- 1 root root 1443 09-22 15:33 shmwrite.c
drwxr-xr-x 2 root root 4096 09-22 17:19 test
第一个字符代表文件类型。d代表目录,-代表非目录。
接下来每三个字符为一组权限,分为三组,依次代表所有者权限,同组用户权限,其它用户权限
每组权限的三个字符依次代表是否可读,是否可写,是否可执行
r 表示拥有读的权限
w 表示拥有写的权限
x 表示拥有可执行的权限
- 表示没有该权限
2、修改权限
可用chmod命令来修改文件权限。
例如:chmod 754 test
4代表读权限,2代表写权限,1代表执行权限
7=4 + 2 + 1,表示拥有可读可写可执行权限
5=4 + 1,表示拥有可读可执行权限,但是没有写权限
0 代表没有任何权限
解压deb包
1,将deb包解压到extract文件夹下
dpkg -X ./xxx.deb extract
2,解压deb包中的control信息(包的依赖在这里面的control文件中)
dpkg -e ./xxx.deb extract/DEBIAN
desktop文件运行shell脚本的一些问题
上面发布之后只能是执行可执行文件,可执行文件有个问题不能配置依赖库的环境变量,只能用系统自带的qt库,这样会造成版本冲突导致程序不能运行。
于是我想用desktop文件执行run.sh脚本来配置环境变量的同时启动程序,这样就不会造成qt依赖库版本混乱的问题,于是我的desktop文件是这样的
[Desktop Entry]
Categories=Network;
Comment=cameraphoto
Comment[zh_CN]=test
Comment[zh_TW]=test
Exec="/opt/apps/com.test.cameraphoto/files/bin/run.sh"
Icon=/opt/apps/com.test.cameraphoto/entries/icons/hicolor/48x48/apps/com.test.cameraphoto.png
MimeType=audio/aac;application/aac;
Name=cameraphoto
Name[zh_CN]=test
Name[zh_TW]=test
StartupWMClass=cameraphoto
Terminal=false
Type=Application
X-Deepin-AppID=com.test.cameraphoto
X-Deepin-CreatedBy=com.deepin.dde.daemon.Launcher
X-Deepin-Vendor=user-custom
run.sh文件是这样的
#!/bin/sh
export LD_LIBRARY_PATH=/opt/apps/com.test.cameraphoto/files/bin/lib:$LD_LIBRARY_PATH
./cameraphoto
点击desktop文件之后,程序就是启动不了,后来打开终端看到如下日志
找不到文件?应该是运行路径不对,于是我在run.sh脚本加了路径选择,脚本如下
#!/bin/sh
cd /opt/apps/com.test.cameraphoto/files/bin
export LD_LIBRARY_PATH=/opt/apps/com.test.cameraphoto/files/bin/lib:$LD_LIBRARY_PATH
./cameraphoto
针对qml项目,如下配置
#!/bin/sh
cd /opt/apps/com.test.acceptancemachine/files/bin
export LD_LIBRARY_PATH=/opt/apps/com.test.acceptancemachine/files/bin/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/opt/apps/com.test.acceptancemachine/files/bin/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/opt/apps/com.test.acceptancemachine/files/bin/qml:$QML2_IMPORT_PATH
./Test_AcceptanceMachine
点击desktop文件可以正常运行了,问题解决。