LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6256|回复: 16

在Debian中打造属于自己的deb包

[复制链接]
发表于 2005-7-9 00:53:47 | 显示全部楼层 |阅读模式
在Debian中打造属于自己的deb包
作者:normalnotebook

问题:如果你要在Debian系统中发布一款软件或者一个包,该如何做呢?如果你的项目中有各种二进制包,该如何维护呢?如果你自己做了一款小小的实用软件,该如何与朋友分享呢?…….

案例:假如我从网上下载了eclipse-SDK-3.1-linux-gtk.tar.gz压缩文件,我想把他安装到/opt/eclipse目录下,且菜单Apps-->rogramming中有Eclipse菜单项。并且在命令终端中输入eclipse中可以运行Eclipse程序,而且还要象其他的软件包一样,可以方便的进行安装(install )和卸载(remove)。

如果你还不知道如何做,请跟我来,我将告诉你解决方案。

熟悉Debian(Linux的发行版之一)的用户,应该对他的包管理机制记忆犹新。便捷的包管理机制是Debian易用的一个主要特性。Debian包管理机制可分为两个层面:对软件包文件操作以及对包中文件的操作。apt和dselect完成前者,dpkg完成后者。

接下来,我们将借助Debian的包管理机制,打造属于自己的deb包。

首先,介绍其目录结构(超级郁闷,放进来的图都变了,所以只好这样描述)
在任何一个目录下新建一个eclipse目录
eclipse/DEBIAN
eclipse/DEBIAN/control
eclipse/DEBIAN/md5sums
eclipse/DEBIAN/postinst
eclipse/DEBIAN/postrm
eclipse/opt
eclipse/opt/eclipse  (是eclipse的安装文件目录)
eclipse/usr
eclipse/usr/bin
eclipse/usr/bin/eclipse(是命令脚本)
eclipse/lib
eclipse/lib/menu
eclipse/lib/menu/eclipse(是菜单配置)
        图一  目录结构
其中,eclipse文件夹表示待发布的软件,也是我们的工作目录。 DEBIAN文件夹下包含control和md5sums等文本文件。opt目录表示待发布的包将要安装(放置)的地方。usr/bin/目录提供了运行该程序命令的脚本。usr/lib/menu目录提供了将Eclipse加入菜单的脚本。

DEBIAN必须大写,且必须为该名。根据不同的情况,该目录将包含不同的文件,其中control和md5sums文件是最小(基本)要求。如果待发布包在安装和卸载,需要运行某些命令或脚本进行初始化和配置时,则会包含下列文件:

preinst
在Debian包文件解包之前,将会运行该脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。

postinst
该脚本的主要任务是完成安装包时的配置工作。通常,“postinst”脚本等待用户输入,或提醒用户,如果他接受当前默认值,要记得软件包安装完后返回重新配置。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。

prerm
该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。

postrm
该脚本负责修改软件包链接或文件关联,或删除由它创建的文件


因为本案例需要将Eclipse加入到菜单中,所以应该包含postinst and postrm这两个文件。

control文件内容如下:

Package:  eclipse

Version:  3.1

Section:  utils

Priority:  optional

Architecture:  i386

Depends:  libc6 (>= 2.3.2.ds1-4),jdk

Installed-Size:  14062

Maintainer:  xxxxxx<xxx@xxxxxx.xxx>

Description: Develop tools



md5sums是基于md5sum命令生成的文件。

因为在安装本包时,只需要更新菜单项,所以postinst脚本只需要包含update-menus命令,卸载时也是同样的操作。其postinst脚本内容为:

程序清单一
#!/bin/sh
# filename : postinst/postrm
        if  test -x /usr/bin/update-menus; then
            update-menus
        fi  

postrm脚本内容跟postinst内容相同。如果你还要做其他的操作,则可以在这两个文件中加入其他内容。

/opt/eclipse/目录就是待发布(安装)的软件目录。对于本例只需要在/opt目录下执行该操作:$ tar  xzvf  eclipse-SDK-3.1-linux-gtk.tar.gz.

要在命令终端中输入eclipse,也能运行Eclipse。通常有三种解决方案:
1)      把/opt/eclipse/加入到PATH变量中。
2)      在/usr/bin目录建立一个指向/opt/eclipse/eclipse的链接
3)      在/usr/bin目录下新建一个脚本,在脚本中运行该程序

综合考虑,第一种方案不可行。第二种方案比较好,但失败了。因为eclipse在运行时,需要starup.jar文件,并且是相对路径下的starup.jar文件,当你在其他任何路径下运行eclipse时,都将会失败。只有采用第三种方案,建立一个脚本。只需要在该脚本中写入:exec /opt/eclipse/eclipse。

程序清单二:
#!/bin/sh
# filename : eclipse
exec  /opt/eclipse/eclipse   

接下来,解决最后一个问题,如何把eclipse加入到Apps-->rogramming的菜单中去?基本上每一个Debian系统的应用程序都会有一个菜单配置文件,用以定义该程序的菜单项名称、位置和命令行选项等参数。该配置文件一般位于/usr/lib/menus、/etc/menu或~/.menu目录下。
我们新建一个文件eclipse ,程序安装后,将置于/usr/lib/menu/路径下
该eclipse配置文件格式示例如下:

?package(eclipse): \    #定义软件包名
       needs="X11" \                   #定义该菜单项需在X11环境中使用
       section="Apps/Programming"\     #定义菜单项的路径位置
       title="Eclipse" \               #定义菜单项的标题
       command="/usr/bin/eclipse" \    #定义命令和选项
       hints="Eclipse"  \              #定义一些提示信息
       icon="/opt/eclipse/icon.xpm"    #定义菜单项的图标


目录结构框架介绍完毕后,就开始打地基,准备文件吧,需要准备的文件有:
1)  control(必须要)
2)  eclipse.sh(用于终端,因为与菜单的eclispe重名,所有加了.sh后缀)
3)  eclipse.menu (用于菜单)
4)  eclipse-SDK-3.1-linux-gtk.tar.gz (下载的eclipse包)
5)  postinst  (用于安装和卸载时调用的脚本)

将上述所有文件放置一目录中,并在该目录下新建mkeclipse脚本,主要用于完成上面的工作,其内容如下:
#!/bin/sh

ROOT=$PWD
ECLIPSE=$ROOT/eclipse-SDK-3.1-linux-gtk.tar.gz
CONTROL=$ROOT/control
POST=$ROOT/postinst
BINECP=$ROOT/eclipse.sh
MENUS=$ROOT/eclipse.menu
if [ -w "$ROOT" ];then
   mkdir eclipse
   cd eclipse
   mkdir DEBIAN opt usr usr/bin usr/lib usr/lib/menu
   cd opt
   if [ -e "$ECLIPSE" ];then
       tar xzvf $ECLIPSE
   fi

   cd ..
   if [ -e "$CONTROL" ];then
      cp $CONTROL DEBIAN/
   fi

   if [ -e "$POST" ];then
      cp $POST DEBIAN/postrm
   fi

   if [ -e "$BINECP" ];then
      cp $BINECP usr/bin/eclipse
   fi

   if [ -e "$MENUS" ];then
      cp $MENUS usr/lib/menu/eclipse
   fi

   rm -f  DEBIAN/md5sums
   find opt usr  -type f -exec md5sum {} \;>>DEBIAN/md5sums
fi

现在已经万事俱备,只欠东风。那现在就草船借东风――借Debian的dpkg包这股东风,来成就我们的事业吧。
制作deb包,在当前ROOT目录运行如下命令:$dpkg -b eclipse eclipse_3.1_i386.deb
也可以在mkeclipse脚本的最后一个fi前加入
       cd $ROOT
       dpkg -b eclipse eclipse_3.1_i386.deb
来完成该功能。

好,现在就开始我们的心动之旅吧。

首先安装deb包:dpkg -i eclipse_3.1_i386.deb  下面打印的消息是不是非常熟悉。

进入图形界面,发现Apps-->rogramming中已经有了Eclipse菜单项,请鼓足勇气单击一下吧,Eclipse IDE已经跃然出现在你的桌面上(当然你的jdk环境已经配置好了)。

接下来,试着卸载一下:apt-get remove eclipse。Eclipse已经从菜单中消失了,/opt/eclipse目录也已经不复存在。

现在觉得是不是很方便?当你看完本文的时候,你是否对文章开始提出的问题已经豁然开朗。其实这样做的目的就是简化劳动,同一个项目组的人在做重复的工作,比如安装eclipse,要在/usr/bin下建立文件,又要在/usr/lib/menu中建立文件,还要拷贝一些eclipse文件,不知道在拷贝的过程中是否会遗漏一些文件等等。或者你的系统出于某种原因要重装,以前的工作又的重新来一遍,很费时。如果你做成了一个deb包,以上的问题和疑虑就迎刃而解。

参考文献:

1.       Debian manual refrence

2.       http://www.nl.debian.org/doc/pac ... enu.html/index.html

我在这里找不到放文章的地方,所以就放到这里来了。
我的Blog  http://blog.csdn.net/normalnotebook
发表于 2005-7-9 01:30:36 | 显示全部楼层
不错,好文
回复 支持 反对

使用道具 举报

发表于 2005-7-9 10:20:22 | 显示全部楼层
good good ,
回复 支持 反对

使用道具 举报

发表于 2005-7-9 10:32:55 | 显示全部楼层
建议:
如果乐意的话,楼主或者其他人,把制作 deb 的过程写成一个通用脚本(bash)。
比如就叫 debmaker,那就更加简单好用了!
回复 支持 反对

使用道具 举报

发表于 2005-7-9 11:58:29 | 显示全部楼层
好文!

JAVA包的制作程序:mpkg-j2se

感觉deb有时候比较烦琐,安装tar.gz反而直截了当,没有一大堆的依赖,非要你升级到unstable。
Eclipse3.1的deb包:
http://www.kaffe.org/~mkoch/eclipse/
适用于unstable
回复 支持 反对

使用道具 举报

发表于 2005-7-9 18:35:52 | 显示全部楼层
好文啊。收藏。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-9 19:38:08 | 显示全部楼层
Post by 蓝铃
建议:
如果乐意的话,楼主或者其他人,把制作 deb 的过程写成一个通用脚本(bash)。
比如就叫 debmaker,那就更加简单好用了!


谢谢大家的鼓励。做成一个通用的,我觉得可以做成一个图形界面的工具,就像eclipse那样的IDE集成开发环境。输入一个工程名,然后为他生成模板,让制作者修改某些文件,点一下运行,就为他生成deb包。在此基础上还可以增加其他的功能。
回复 支持 反对

使用道具 举报

发表于 2005-7-10 06:58:14 | 显示全部楼层
Ha...Ha...Very good article.

Well, I am rather lazy.  Usually, I build the deb from src with:

1. Unpack source tarball, tar jxf xxxx.tar.bz2
2. cd xxxxx
3. ./configure --prefix=/usr
4. make -j2
5. checkinstall -D (run by root, not "make install")
When finished, your package is already installed and a xxxx.deb is also prepared for you.  Installed package can also be removed by dpkg --purge xxxx

Of course, you need to install checkinstall and dpkg-dev packages first.
回复 支持 反对

使用道具 举报

发表于 2005-8-29 13:03:04 | 显示全部楼层
稍微详细点的可读这个
Debian New Maintainers' Guide

http://www.debian.org/doc/maint-guide/ch-start.en.html
回复 支持 反对

使用道具 举报

发表于 2005-8-29 18:14:45 | 显示全部楼层
直接 apt-get install maint-guide-zh

然后阅读 /usr/share/doc/maint-guide/maint-guide.zh_CN.html/index.zh-cn.html


这是 Debian新维护人员手册的中文翻译
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表