- 认证技术问题
- 键鼠模拟点击测试工具--xdotool
- Q:命令行修改屏幕分辨率
- KVM虚拟机-复制克隆(命令行)
- 统信UOS安装cherrytree
- 未进开发者根证书导入uos浏览器生效方案
- 将A卡驱动从从radeon切换为amdgpu
- uos系统ulimit工具使用
- kvm虚拟机运行时显示“启动域时出错”
- UOS文件命名最多支持字符数
- 在uos系统中如何下载不同架构的包
- 登录时输入正确密码后无法登陆 显示密码错误
- 通过终端判断窗口特效是否开启及开启关闭窗口特效
- 应用软件驻留任务栏问题
- FTP底层存储文件乱码
- 初识apache flink
- UOS专业版1032软件商店下载安装包缓存在哪里
- 如何用命令行查看当前cpu温度
- kvm远程连接报错ssh key
- 外设/认证类userid接口获取方式
- 命令行安装字体
- UOS访问windows文件共享
- uos系统中dbus调用api实现一些基本功能
- 用命令行设置关闭显示器、进入待机、自动锁屏
- 命令切换python版本
- uos系统中dbus调用实现系统锁屏
- UOS-lsmhookmanager程序的Demo
- KVM支持UEFI引导
- 身份鉴别系统如何接入UOS的PAM框架
- UOS收集桌面日志
- UOS远程windows桌面
- 获取有效打印机日志方法
- UOS浏览器导入证书
- 开发者问题反馈指南
- 因节信息为空,导致的签名失败的问题
- 搜狗输入法导入字体库
- LightDM桌面显示器相关技术内容(系统默认)
- 源码打包为deb
- 开源大数据部署手册
- UOS查看摄像头是否链接成功
- 安装双系统后无法进入UOS系统
- 进入桌面系统弹黑屏PoolCreationFaile解决办法
- udev详解
- dpkg: 处理软件包 uos-browser-stable
- 统信云打印
- uos-route路由相关操作
- 统信UOS操作系统-共享文件夹
- 统信UOS操作系统-定时关机
- 解决 tail 命令提示“inotify 资源耗尽,无法使用
- 使用字体管理器导入字体
- 清除浏览器dns缓存
- 在 Linux 中永久修改 USB 设备权限
- kvm 显示spice协议错误
- uos系统切换java版本
- rpm包在uos系统无法直接安装
- 更改密码后如何绕过登陆密钥环验证
- deb安装后,启动菜单没有启动图标
- 应用上架报错“获取不到包信息请检查”
- qt creator不能输入中文
- uname -v 第一个字段意义
- zabbix安装文档
- 统信服安装完系统后,切换root用户没有root用户密码
- uos系统中dbus调用实现特效模式开关
- UOS非开发者模式调用dmidecode
- 非适配完成打印机官方驱动安装方法
- apache spark 部署
- 使用MegaCli做raid
- 任务栏出现两个图标
- 通过 gdebi 工具解决安装本地包缺失依赖问题
- UOS通过Nginx托管Net Core服务
- 回收站删除时提示权限问题无法删除
- Linux 命令行查看图片详细信息(分辨率、色深、格式等)
- 切换JDK默认版本
- uos Postgresql 12.1 安装过程笔记
- PostgreSQL关系数据库
- kvm虚拟机运行时显示“启动域时出错”
- 统信UOS安装steam
- 如何查看uos浏览器是否支持flash
- uos系统中dbus调用api实现个性化透明度
- 如何确定deb包是否已经过统信方面的签名
- appimage打包基础步骤
- 命令行制作U盘启动盘方法
- vim配置优化
- 强制关机后磁盘数据损坏,initramfs无法挂载进不去系统
- 如何安装Debian&uos双系统
- 激活过程中提示服务器连接失败
- UOS浏览器内部协议(部分)
- uos设备管理器取值对照表
- 系统最小化安装,字符界面实现EAP认证
- dbus使用方法
- uos系统中dbus调用实现注销系统
- KVM虚拟机--删除(命令行)
- ppd文件打包deb
- uos和uos之间如何共享奔图打印机
- 驱动安装时提示"hplip-plugin"无法安装
- 离线环境先如何激活系统
- 基于UOS 部署微软.NET环境
- 外设驱动重新打包
- 关于打包过程dpkg-source -b . 命令构建出deb包时报错简单分析
- UOS更换英伟达官方显卡驱动
- 如何查看系统安装时间
- uos1030MIPS服务器安装kms激活
- uos远程连接工具--FinalShell的安装和使用
- 公网deb包转uos的deb包
- 开机引导后无法进入系统,显示busybox v1.30.
- 统信UOS命令行更改时间
- 在商店上架的应用显示程序大小异常
- 点击桌面上关机按钮,提示阻挡关机
- UOS浏览器下查看浏览器插件情况
- 打包规范之control文件字段说明
- UOS中输入法框架的开发技术是什么?
- uos右键刷新
- 开源堡垒机JumpServer解决方案
- UOS浏览器导入根证书
- 行业版环境如何实现远程适配?
- 修改系统默认语言编码
- 统信桌面操作系统查看当前版本
- 开源ZooKeeper集群解决方案
- lspci命令的应用
- 获取xxx软件包及依赖
- 开源ffmpeg的使用
- 用uos创建共享打印机
- deb安装,右键卸载失败的问题
- 系统历史启停时间查询脚本
- 串口使用及配置
- UOS切换至root用户命令无法补全问题
- .desktop文件Exec字段参数解释
- 自签名后因为系统时间变更导致程序无法运行
- 怎么使用iBMC工具安装uos操作系统
- activemq服务无法启动
- 二进制软件包打包为deb
- apt命令提示lock异常解决方案
- 应用软件打包辅助工具v1.0版本
- "提示:E: dpkg 被中断,您必须手工运行 ‘sudo
- 最小化环境命令行激活系统
- 如何拉取软件依赖包
- dpkg: 警告: 无法找到软件包 xxx 的文件名列表文件
- uos浏览器如何清除dns缓存
- 浏览器闪退解决方案
- 检查deb包打包规范脚本
- UOS自定义右键新建文档
- apache samza部署
- UOS 实现 rc.local 开机执行命令
- smb自动挂载
- UOS 搭建Firekyin个人网站
- 统信服务器操作系统设置登录时自动填充用户名
- 修改tomcat的最大连接数
- 单用户模式下创建一个可登录的用户
源码打包为deb
源码打包为deb
规范请见:[商店应用打包规范](https://doc.chinauos.com/content/M7kCi3QB_uwzIp6HyF5J)
本文档将演示根据商店打包规范从源码构建规范的软件包
1. **我们从零开始,首先写一个创建一个用来打包的目录和一个c文件**
```bash ➜ ~ mkdir -p build-demo/build-demo-0.0.1/src;cd build-demo/build-demo-0.0.1/src;vim demo.c ➜ src cat demo.c
include<stdio.h>
int main() { printf("this is a demo ! \n"); return 0; } ```
本文主要演示打出一个规范的deb包,所以,如你所见,这个c文件就是这么简单,用来演示够用了
2. **接下来,写Makefile**
同样简单的Makefile
``````bash
➜ com.apps.build-demo-0.0.1 ls
Makefile src
➜ com.apps.build-demo-0.0.1 cat Makefile
PREFIX = /opt/apps/com.apps.demo
all: prepare build-bin
prepare:
mkdir -p bin
build-bin:
$(CC) -o bin/demo src/demo.c
install:
mkdir -p ${DESTDIR}${PREFIX}/files/bin
install -v bin/demo ${DESTDIR}${PREFIX}/files/bin
clean:
rm -rf bin
.PHONY: all clean
注意:根据商店规则,软件安装在/opt/apps/
下,所以Makefile的PREFIX我们给了值为/opt/apps/com.apps.demo
,软件的可执行文件要安装在 /opt/apps/$包名$/files/bin/
目录下,所以 Makefile写的安装位置写的是 ${DESTDIR}${PREFIX}/files/bin
,如果你的Makefile之前已经写好,那你可能需要根据商店的规范修改一下
3. 接下来构建一个规范的软件目录,用来按规则放其他的文件,完整的目录结构为:
➜ ~ tree demo/
demo/ #此目录以包名命名
├── 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
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:申威CPU permissions:应用权限描述。
- autostart:是否允许自启动
- notification:是否允许使用通知
- trayicon:是否运行显示托盘图标
- clipboard:是否允许使用剪切板
- account:是否允许读取登录用户信息
- bluetooth:是否允许使用蓝牙设备
- camera:是否允许使用视频设备
- audio_record:是否允许进行录音
- installed_apps:是否允许读取安装软件列表 support-plugins: 支持的插件类型 plugins:实现的的插件类型,在对应的plugins目录下,按照实现的插件类型放置文件。 在安装时,系统会将插件链接到对应的应用目录。 本软件info内容参考如下:
➜ com.apps.build-demo-0.0.1 cat com.apps.demo/info
{
"appid": "com.apps.demo",
"name": "Demo",
"version": "0.0.1",
"arch": ["amd64"],
"permissions": {
"autostart": false,
"notification": false,
"trayicon": false,
"clipboard": false,
"account": false,
"bluetooth": false,
"camera": false,
"audio_record": false,
"installed_apps": false
}
}
本演示包我提供了desktop文件和图标,所以本包的软件目录格式为:
➜ com.apps.build-demo-0.0.1 tree demo
demo
├── entries
│ ├── applications
│ │ └── com.apps.demo.desktop #desktop文件必须要以包名命名
│ └── icons
│ └── hicolor
│ ├── 512x512
│ │ └── apps
│ │ └── com.apps.demo.png
│ └── scalable
│ └── apps
│ └── com.apps.demo.svg
├── files
└── info
9 directories, 4 files
到此,我们的源码构建完毕,源码树如下: ``````bash ➜ com.apps.build-demo-0.0.1 tree . ├── demo │ ├── entries │ │ ├── applications │ │ │ └── com.apps.demo.desktop │ │ └── icons │ │ └── hicolor │ │ ├── 512x512 │ │ │ └── apps │ │ │ └── com.apps.demo.png │ │ └── scalable │ │ └── apps │ │ └── com.apps.demo.svg │ ├── files │ └── info ├── Makefile └── src
└── demo.c 11 directories, 6 files ``````
- 接下来使用
dh_make --createorig -s
命令生成debian
目录
当前目录下会自动创建debian
目录,目录下有很多打包使用的模板文件,以.ex/.EX结尾,对于此软件包,我们不需要这些模板文件,所以全部删掉
➜ com.apps.build-demo-0.0.1 dh_make --createorig -s
Maintainer Name : liuyong
Email-Address : [email protected]
Date : Tue, 17 Mar 2020 15:44:30 +0800
Package Name : com.apps.build-demo
Version : 0.0.1
License : blank
Package Type : single
Are the details correct? [Y/n/q]
Done. Please edit the files in the debian/ subdirectory now.
➜ com.apps.build-demo-0.0.1 ls debian
build-demo.cron.d.ex changelog copyright manpage.xml.ex postrm.ex README.Debian source
build-demo.doc-base.EX compat manpage.1.ex menu.ex preinst.ex README.source watch.ex
build-demo-docs.docs control manpage.sgml.ex postinst.ex prerm.ex rules
➜ com.apps.build-demo-0.0.1 rm debian/*.ex debian/*.EX
- 接下来可以根据自己的需要去编辑
changelog
,control等文件,我只修改了control文件:
➜ com.apps.build-demo-0.0.1 cat debian/control
Source: com.apps.build-demo
Section: utils
Priority: optional
Maintainer: liuyong <[email protected]>
Build-Depends: debhelper (>= 11)
Standards-Version: 4.1.3
Homepage: http://www.chinauos.com
#Vcs-Browser: https://salsa.debian.org/debian/build-demo
#Vcs-Git: https://salsa.debian.org/debian/build-demo.git
Package: com.apps.build-demo
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: this is a demo;
<insert long description, indented with spaces>
接下来要指定下之前创建的软件包demo
目录的安装路径,可以在Makefile里面写,也可以使用debian/install
来实现,本文使用install来实现
在debian
目录下写一个install,内容如下:
➜ com.apps.build-demo-0.0.1 vim debian/install
➜ com.apps.build-demo-0.0.1 cat debian/install
com.apps.demo/ /opt/apps
代表将com.apps.demo目录按照规则装在/opt/apps/
目录下
6. 然后debuild
或者dpkg-buildpackage
打包
接下来可以看到在上级目录有了打包的deb包,但在debuild
过程中,包的帮助手册,以及copyright
和changelogs
都会在打包过程中安装到/usr/share/doc
目录下,我们要把这个目录改装在files目录下,使用fakeroot dpkg-deb -R pkg.deb a
来将名为pkg的deb包解压到 a
目录下,doc目录mv到files目录下,然后删除空的/usr/share/
目录,使用fakeroot dpkg-deb -b a pkg.deb
将改好的包格式压入deb包内,可以使用dpkg-deb -c pkg.deb
命令来查看deb包的安装文件目录,确定所以文件都安装在/opt/apps/包名 这个目录下即可
bash ➜ com.apps.build-demo fakeroot dpkg-deb -R com.apps.build-demo_0.0.1-1_amd64.deb a ➜ com.apps.build-demo mv a/usr/share/doc a/opt/apps/com.apps.demo/files ➜ com.apps.build-demo rm -rf a/usr ➜ com.apps.build-demo ls a DEBIAN opt ➜ com.apps.build-demo fakeroot dpkg-deb -b a com.apps.build-demo_0.0.1-1_amd64.deb dpkg-deb: 正在 'com.apps.build-demo_0.0.1-1_amd64.deb' 中构建软件包 'com.apps.build-demo'。
通往罗马的路不止一条,打包也不止一种方式,示例中的很多打包规则都可以使用其他方法替代,比如desktop文件你可以写脚本让它在打包过程中生成,比如安装文件到指定目录可以用install,也可以在Makefile里写,比如生成在doc目录的copyright和changelogs的压缩文件是由dh_installdocs和dh_installchangedocs生成的,你可以在rules里override掉自己写,让他们直接安装在指定的目录去
重点是打成的包要符合商店的规范,大致如下:** 包名要使用倒置域名规则
应用的全部安装文件必须在/opt/apps/你的包名/ 这个目录下
包中不允许存在post/pre inst/rm 这用钩子脚本
应用根目录下要有entries和files目录和json格式的info文件
应用只允许使用普通用户权限启动,禁止应用以任何形式获取root权限
entries目录存放程序的各种入口文件
desktop文件放在 entries/applications目录下
自启动文件放在 entries/autostart目录下
图标根据尺寸大小放在 entries/icons/hicolor/尺寸/apps/目录下,SVG格式图标放在 entries/icons/hicolor/scalable/apps目录下
插件放在 entries/plugins目录下
dbus服务和systemd服务放在 entries/services目录下
schema文件放在 entries/glib-2.0目录下
gseetings文件放在 entries/GConf目录下
语言包文件放在 entries/locale目录下
软件帮助文档放在放在 entries/help目录下
其他文件放在files目录下