基于国产UOS操作系统deb包转uos包实例

打包⽰例
本⽂档使⽤ eog 包进⾏演⽰从旧规则的包改成新规则的包的过程⽰例
如果是从源码直接编译,请根据商店打包规范 遵守新规则规范即可
第⼀步 获取deb包
使⽤ apt download eog 或者其他⽅式来下载⼀个旧规则的 eog 包
然后使⽤ fakeroot dpkg-deb -R pkg.deb a 来将名为pkg的deb包解压到 a ⽬录下

deepin@deepin-PC:~/test/eog$ apt download eog
获取:1 http://10.0.10.25/uos eagle/main amd64 eog amd64 3.28.4-2+b1 [5,092 kB]
已下载 5,092 kB,耗时 0秒 (108 MB/s)
deepin@deepin-PC:~/test/eog$ fakeroot dpkg-deb -R eog_3.28.4-2+b1_amd64.deb a
deepin@deepin-PC:~/test/eog$ ls
a eog_3.28.4-2+b1_amd64.deb

第⼆步 改包名和版本号
按照新规则,我们要使⽤倒置域名规则来命令包名,并且要升级⼀下版本号
修改a⽬录下的 DEBIAN ⽬录下的 control ⽂件,具体为修改Package字段和Version字段
未修改之前的

deepin@deepin-PC:~/test/eog$ cd a
deepin@deepin-PC:~/test/eog/a$ head -n 5 DEBIAN/control
Package: eog
Source: eog (3.28.4-2)
Version: 3.28.4-2+b1
Architecture: amd64
Maintainer: Debian GNOME Maintainers 

修改之后为

deepin@deepin-PC:~/test/eog/a$ vim DEBIAN/control
deepin@deepin-PC:~/test/eog/a$ head -n 5 DEBIAN/control
Package: org.gnome.eog
Source: eog (3.28.4-2)
Version: 3.28.4-3+b1
Architecture: amd64
Maintainer: Debian GNOME Maintainers 

包名变成了 org.gnome.eog ,版本号变成了 3.28.4-3+b1
版本号由软件版本号和打包版本号组成,由 - 分割,左边是软件版本号,右边是打包版本号,我们升级版本号只修改打包版本号
第三部 创建新规则包结构,并且将旧规则的包内容移到新规则包结果⾥⾯
新规则包结构⼤致为

deepin@deepin-PC:~/test/eog/a$ tree opt/
opt/
└── apps
└── org.gnome.eog #此⽬录以包名命名
├── entries
│ ├── applications #放desktop⽂件
│ ├── autostart #放⾃启动⼊⼝⽂件
│ ├── icons #应⽤的图标⽂件,根据⼤⼩放进不同的⽬录下的apps/⽬录下,svg格式的放
在scalable/apps/⽬录下
│ │ └── hicolor
│ │ ├── 128x128
│ │ │ └── apps
│ │ ├── 16x16
│ │ │ └── apps
│ │ ├── 24x24
│ │ │ └── apps
│ │ ├── 256x256
│ │ │ └── apps
│ │ ├── 32x32
│ │ │ └── apps
│ │ ├── 48x48
│ │ │ └── apps
│ │ ├── 512x512
│ │ │ └── apps
│ │ ├── 64x64
│ │ │ └── apps
│ │ └── scalable
│ │ └── apps
│ ├── plugins #插件的⽬录
│ └── services #dbus服务⽬录
│ └── glib-2.0 #schema⽂件
│ └── GConf #gseetings⽂件
│ └── locale #语⾔包⽂件
├── files #其他⽂件
└── info #应⽤的⼀些信息
28 directories, 1 file

结构的具体解释可以参考 商店打包规范
接着查看我们解压出来的除 DEBIAN ⽬录外的其他⽬录⽂件,按照规则放在相应的⽬录下
eog 包除 DEBIAN ⽬录外只有⼀个 usr ⽬录,我们查看下 usr ⽬录

deepin@deepin-PC:~/test/eog/a/usr$ ls
bin lib share

bin⽬录是可执⾏⽂件⽬录,lib是运⾏依赖库⽬录,按照规则放在 opt/apps/org.gnome.eog/files/ ⽬录下

deepin@deepin-PC:~/test/eog/a/usr$ mv bin/ lib/ ../opt/apps/org.gnome.eog/files/
deepin@deepin-PC:~/test/eog/a/usr$ ls ../opt/apps/org.gnome.eog/files/
bin lib

查看剩下的share⽬录

deepin@deepin-PC:~/test/eog/a/usr/share$ ls
applications doc eog GConf glib-2.0 help icons locale man metainfo

按照规则 将 applications , GConf , glib-2.0 , icons , locale ⽬录放在相应的位置去,剩下的全部放在files⽬录下

deepin@deepin-PC:~/test/eog/a/usr/share$ mv applications/
../../opt/apps/org.gnome.eog/entries/
deepin@deepin-PC:~/test/eog/a/usr/share$ mv GConf/
../../opt/apps/org.gnome.eog/entries/
deepin@deepin-PC:~/test/eog/a/usr/share$ mv glib-2.0/
../../opt/apps/org.gnome.eog/entries/
deepin@deepin-PC:~/test/eog/a/usr/share$ mv locale/
../../opt/apps/org.gnome.eog/entries/
deepin@deepin-PC:~/test/eog/a/usr/share$ mv icons/
../../opt/apps/org.gnome.eog/entries/
deepin@deepin-PC:~/test/eog/a/usr/share$ mv *
../../opt/apps/org.gnome.eog/files/

本包没有⾃启动⽂件和services⽂件,所以不做处理
把usr⽬录下的所有⽂件按照规则 放置后,保证usr⽬录为空后删除usr⽬录

deepin@deepin-PC:~/test/eog/a$ tree usr/
usr/
└── share
1 directory, 0 files
deepin@deepin-PC:~/test/eog/a$ rm -rf usr/

第四步,编辑info⽂件
接下来填写info⽂件的内容,info⽂件的字段解释在商店打包规范⾥⾯有,具体这⾥不再解释,编辑好的⽂件如下

deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog$ cat info
{
"appid": "org.gnome.eog",
"name": "eog",
"version": "3.28.4-3+b1",
"arch": ["amd64"],
"permissions": {
"autostart": false,
"notification": false,
"trayicon": false,
"clipboard": false,
"account": false,
"bluetooth": false,
"camera": false,
"audio_record": false,
"installed_apps": false
}
}

第五步 创建启动脚本⽤来 export LD_LIBRARY_PATH
某些包带有⾃⼰的运⾏依赖库,新规则之前都是安装在 /usr/lib/ ⽬录下,在系统启动时可以找到需要的运⾏库
新规则不允许安装在 /usr/lib/ 下,所以我们写⼀个启动脚本,先使⽤LD_LIBRARY_PATH 环境变量来导出运⾏依赖库的路径,再去执⾏可执⾏⽂件

deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files$ cd bin/
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ ls
eog
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ vim eog.sh
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ vim eog.sh
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ cat eog.sh
export LD_LIBRARY_PATH='/opt/apps/org.gnome.eog/files/lib/x86_64-linux-gnu/eog'
/opt/apps/org.gnome.eog/files/bin/eog
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ ll
总⽤量 20
-rwxr-xr-x 1 deepin deepin 14408 1⽉ 11 2019 eog
-rw-r--r-- 1 deepin deepin 118 1⽉ 17 14:17 eog.sh
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ chmod a+x eog.sh
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/files/bin$ ll
总⽤量 20
-rwxr-xr-x 1 deepin deepin 14408 1⽉ 11 2019 eog
-rwxr-xr-x 1 deepin deepin 118 1⽉ 17 14:17 eog.sh

第六步,编辑desktop⽂件
将desktop⽂件重命名为包名.desktop格式
修改exec字段,exec是可执⾏⽂件的路径,因为我们改了包的安装位置,所以exec字段也要修改为正确的可执⾏⽂件的路径

deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/entries/applications$ mv
eog.desktop org.gnome.eog.desktop
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/entries/applications$ vim
org.gnome.eog.desktop
deepin@deepin-PC:~/test/eog/a/opt/apps/org.gnome.eog/entries/applications$ cat
org.gnome.eog.desktop |grep Exec
TryExec=/opt/apps/org.gnome.eog/files/bin/eog.sh
Exec=/opt/apps/org.gnome.eog/files/bin/eog.sh %U

第七步,删除钩⼦脚本
按照新规则,所有的包不可以再使⽤ post/pre inst/rm 等钩⼦脚本,所以删除 DEBIAN ⽬录下的钩⼦脚本,(因本包并⽆钩⼦脚本,所以以下演⽰删除的脚本是我⾃⼰touch的)

deepin@deepin-PC:~/test/a$ cd DEBIAN/
deepin@deepin-PC:~/test/a/DEBIAN$ ls
control md5sums postinst postrm preinst prerm
deepin@deepin-PC:~/test/a/DEBIAN$ rm postinst postrm preinst prerm
deepin@deepin-PC:~/test/a/DEBIAN$ ls
control md5sums
deepin@deepin-PC:~/test/a/DEBIAN$

第⼋步 , 压包
将按照新规则放置好的⽬录压⼊deb包内

deepin@deepin-PC:~/test/eog$ fakeroot dpkg-deb -b a org.gnome.eog_3.28.4-
3+b1_amd64.deb
dpkg-deb: 正在 'org.gnome.eog_3.28.4-3+b1_amd64.deb' 中构建软件包 'org.gnome.eog'。
deepin@deepin-PC:~/test/eog$ ls
a eog_3.28.4-2+b1_amd64.deb org.gnome.eog_3.28.4-3+b1_amd64.deb

最后⼀步,安装测试包是否能运⾏,在启动器是否有图标显⽰

deepin@deepin-PC:~/test/eog$ sudo dpkg -i org.gnome.eog_3.28.4-3+b1_amd64.deb
deepin@deepin-PC:~/test/eog$ sudo apt install -f

如果在终端安装,需要⾃⼰解决依赖关系, apt install -f 是修复依赖关系的

你可能感兴趣的:(国产操作系统UOS的前世今生,Linux入门)