制作RPM包最关键的就是要写SPEC文件。安装一个程序就是写一些配置项,然后把源码或者二进制码放入安装目录下。如果是用GCC的程序,RPM确实很方便,./config, make ,make install, clean全部都在这个spec文件里配置。编译,安装一次完成。可以保留其源码,也可以不保留。关于spec文件的书写网络资料铺天盖地,就不详细介绍了。推荐一篇不错的
http://hlee.iteye.com/blog/343499
我的需求目前仅仅是把编译好的java class 文件从一个地方拷贝到指定的地方,这就代表安装了。正在研究以后是否可以把ant也集成进来,原则上是可以的。下面介绍下我做包的过程吧。
1 下载rpm-build包
这个包是用来制作包的,它本身就是个rpm包,linux下很多软件都是rpm包的形式来安装的。如果用rpm -ivh ***.rpm安装,发现装不上,因为它要依赖很多其他的包。所以需要还是用yum安装吧。可以自动去找那些dependency来安装。
2 写spec文件
spec文件里有软件的版本,build,厂商拉。。。一堆属性信息。把头填好了,就写SPEC脚本了,就是一堆%pre, %build等等。以%开头的地方。我的spec如下
Summary:example Name:new Version:0.1 Release:4 Group:Application/User License:Share Packager:dj BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root Prefix:%{_prefix} %description #rpmtest example %define userpath /usr/local/test/ %changlog *Oct 25 2010 -build for the first time. %prep cp -r /usr/src/redhat/test/ /usr/src/redhat/SOURCES/ %build %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%userpath cp -r /usr/src/redhat/SOURCES/. $RPM_BUILD_ROOT%userpath %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %{userpath}
解释几个容易迷惑的地方
1) BuildRoot
这是个临时的目录,制作安装包的时候用来测试的,定义好以后,后面的RPM_BUILD_ROOT 就指这个目录。执行install的时候了(当然由你自己把安装的动作放到这里的),会把文件安装到这个目录下面。所以在clean的时候了,又把下面的东西给删除了。如果没有它,那制作安装包的过程会把文件安装的真实环境里。
2) %files
这个文件列表起一个check的作用,表示我要装这些文件,看看rpm包你到底有没有安装。所以有时候会出现 installed (but unpackaged) file(s) found 的错误。表示你的files列表不对。
3) 执行安装的时候文件安装到哪里去了?
安装以后可以通过命令 rpm -ql name 来查询这个包安装的路径。真是的路径就是RPM_BUILD_ROOT后面的%userpath
。
3 执行rpmbuild建包
做好包以后使用命令
rpmbuild -bb new.spec
根据spec脚本,执行建包过程。这个命令是构建二进制包,如果还需要保留源码那就是要用选项 -ba了。建好的rpm包放在这个目录下 Wrote: /usr/src/redhat/RPMS/x86_64/new-0.1-4.x86_64.rpm。如果有源码包的话在目录/usr/src/redhat/SRPMS下面。SRPM包是什么了?有时候你的包在你的环境下build出来的,换到其他地方可能一些环境变了,这时候需要重新在那个环境下rebuild。所以就徐哟啊这个SRPM了。
4 安装
rpm -ivh /usr/src/redhat/RPMS
这个时候包就会安装在路径userpath /usr/local/test/ 里边。
注意了不是路径RPM_BUILD_ROOT,那个只是制作安装包时用来测试的。如果想指定个路径,那就要使用{_Prefix}这个脚本了。SPEC里边加了这样,就可以使用命令
rpm -ivh --prefix path /usr/src/redhat/RPMS
安装到path路径下面。
5 查询
rpm有一列的查询命令
rpm -ql 查询安装路径信息
rpm -qi 软件信息,就是自己写的那一堆头
rpm -qf 这个是反查询的,根据路径,需要查询它是数据哪个包的
有个地方需要注意的是,查询以及卸载最好使用 rpm -ql name-version-build
如果用全名的话会查不到,或者卸不掉
如果只用name的话可能会查出N个版本的信息揉在一起