做完自己的开发之后,想要发布自己的代码,怎么办呢,比如如何给已有的系统打补丁,或者作为一个安装包在新部署的系统环境中存在呢?
其实要分情况,如果是社区兼容性的东西(符合社区blueprint),能够被社区admin review通过的,当然直接提交到社区比较合适;如果是自己特有的功能,仅仅是少数几个
文件的修改,使用diff/patch 将改动做成patch,之后apply 即可,如果涉及到文件的增删改,同时相对比较多的时候,且希望使用例如puppet之类的部署工具,作为
一个模块将自己的改动部署掉,则需要打包了,centos上就打rpm包,ubuntu则需要打deb的包,这两天打deb包的过程record一下,以后还可能用,rpm的遇到再说。
事实上deb的包里面内容还是挺多的,有很多种用法,一下是我经验证可以的方式,不一定最佳。
第一种方式. 从零开始制作自己的包:
1. sudo apt-get install packaging-dev dh-make 安装需要的包
2.设置环境变量,这些内容将在deb包中的control文件中出现
DEBEMAIL="your_email_address@domain.com"
DEBFULLNAME="Your Name"
export DEBEMAIL DEBFULLNAME
3.生成deb的架子,各个参数的意义可以使用dh_make --help查看
dh_make -i -n -p packagename_1.0.0 -c gpl2, 生成的目录中ex和EX结尾的文件可以删除
4. 修改control文件,在Depends字段添加该包的依赖,可以修改Section等,不过不修改也没关系,
5. 添加postinst, postrm, preinst三个script文件,实际上是三个脚本(#!/bin/sh),其中preinst是安装开始前做准备的工作,比较在/usr/share下生成一个目录,
删除某个目录,或者做一些检查之类的;postinst是安装之后做一些动作,同样可以增删改文件,重启服务等; postrm表示使用"dpkg -P" 卸载包时做的动作,
一般会将安装时做的修改回退,比如删除添加的文件和目录,使用patch -R,回退修改等。
6. 添加install文件,此文件中内容为“pathA pathB”, 中间以空格隔开的多行数据,表示将pathA下的内容拷贝到pathB下,安装过程会做很多的拷贝,就写在这里,
拷贝的时候pathA的路径是相对路径,比如packagename下面有debian目录和‘test’ 目录,要将test目录中的文件test.txt移到/etc/init.d下,则写为:
“test/test.txt /etc/init.d/”
7. 在packagename目录中运行“debuild -us -uc”, 则在和packagename同级目录生成所需的deb包, 其中us 和uc参数表示不使用GPG签名包。
第二种方式.修改现有的包:
找一个包,解压后修改然后重新打包,有时候更方便,同时如果用第一种方式做的包,结果发现有点儿问题,重新做太麻烦,就用第二种了。
1. 使用 “dpkg -X test.deb test”, 将test.deb解压到testmul
2. mkdir test/DEBIAN, 创建目录,这里DEBIAN是大写,使用小写的debian不识别,创建包的时候用命令生成的是debian的目录,可能跟第一种和第二种做包
的命令不同有关,没继续研究了。
3. 使用“dpkg -e test.deb test/DEBIAN” 将打包过程的信息解压到test/DEBIAN中
4. 在test/DEBIAN中有control,md5sums,postinst, postrm, preinst, 和做包时候的内容一致,做包时候的install文件中的内容在第一步生成的test目录下,
打开其对应的路径,发现其内容是install执行copy之后的实际文件位置
5. 修改control,postinst,postrm,preinst
6. 修改完成后在test同级目录执行“dpkg-deb -b test .”, 则在test同级目录生成test.deb
依赖冲突解决:
无论安装rpm还是deb的包经常遇到各种冲突,比如系统安装的包的版本和“control文件中Depends中定义的不匹配”等,
保险的情况下当然是升级系统的版本,但是各种依赖交叉,会让安装的过程变得很头疼,事实上,有些依赖并不是那么严格,
比如一些小版本等等,为了让安装变得顺利,我们可以将包解压,修改control中的Depends字段,重新打包之后安装。
当然了,除非你对版本之间的差异特别情况,否则请严格测试,否则这样的方式并不推荐。
mark link:
https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html