我已经看过了轻松解压 DEB、编辑 postinst 以及重新打包 DEB- 但是,如果我想对原始 .deb 文件进行一些更改,该文件并没有解释如何正确更改 .deb 版本号。
我使用的是 Ubuntu 14.04,举hostapd
个例子:
$ mkdir /tmp/debtest
$ cd /tmp/debtest/
$ apt-get download hostapd
Get:1 http://dk.archive.ubuntu.com/ubuntu/ trusty-updates/universe hostapd amd64 1:2.1-0ubuntu1.4 [423 kB]
Fetched 423 kB in 1s (361 kB/s)
$ ls -la hostapd_1%3a2.1-0ubuntu1.4_amd64.deb
-rw-rw-r-- 1 myuser myuser 422846 Nov 10 2015 hostapd_1%3a2.1-0ubuntu1.4_amd64.deb
现在我们可以按照上面引用的链接解压:
$ mkdir unpack-hostapd
$ dpkg-deb -R hostapd_1%3a2.1-0ubuntu1.4_amd64.deb unpack-hostapd
$ ls -la unpack-hostapd/
total 20
drwxr-xr-x 5 myuser myuser 4096 Jan 26 11:31 .
drwxrwxr-x 3 myuser myuser 4096 Jan 26 11:31 ..
drwxr-xr-x 2 myuser myuser 4096 Nov 9 2015 DEBIAN
drwxr-xr-x 6 myuser myuser 4096 Nov 9 2015 etc
drwxr-xr-x 4 myuser myuser 4096 Nov 9 2015 usr
假设我想进行一个简单的更改,例如将一行文本附加到 README.Debian:
echo "Just a test line" >> unpack-hostapd/usr/share/doc/hostapd/README.Debian
...现在我想将其重新打包为新的 .deb。
第一个问题- 有没有办法从解压状态检索包的当前(旧)版本?因为我不信任文件名,所以我通常会这样做:
$ apt-cache policy hostapd
hostapd:
Installed: (none)
Candidate: 1:2.1-0ubuntu1.4
...
...这告诉我我在使用时下载了该软件包的版本 1:2.1-0ubuntu1.4 apt-get download...
- 但不一定是目录中的版本unpack-hostapd
。是否有命令可以告诉我解压到目录中的原始 .deb 的软件包版本unpack-hostapd
?
现在,我debchange
像dch -i
以前一样使用自动递增版本号(尽管在其他源项目中),但是当我在这里尝试时:
$ cd unpack-hostapd
$ pwd
/tmp/debtest/unpack-hostapd
$ dch -e
dch: fatal error at line 580:
Cannot find debian/changelog anywhere!
Are you in the source code tree?
(You could use --create if you wish to create this file.)
$ find . -name 'changelog*'
./usr/share/doc/hostapd/changelog.Debian.gz
$ dpkg -c ../hostapd_1%3a2.1-0ubuntu1.4_amd64.deb | grep changelog
-rw-r--r-- root/root 2126 2015-11-09 14:56 ./usr/share/doc/hostapd/changelog.Debian.gz
……但是,我无法改变这里的任何事情。
所以我的第二个问题是:有没有一种简单的方法(就像dch -i
源包一样)来更改 .deb 包版本号,并可能向解压的 .deb 包添加更改日志?
当然,最终我想将这个新版本重新打包为 .deb 包,上面的链接建议类似dpkg-deb -b unpack-hostapd hostapd_1%3a2.1-0ubuntu1.4_amd64.deb
;虽然,在这里说我宁愿使用 version 1:2.2
,所以我最终会使用这样的文件名dpkg-deb -b unpack-hostapd hostapd_1%3a2.2_amd64.deb
- 但是,该版本也应该与 .deb 中记录的内容匹配,我不知道该怎么做......
答案1
DEBIAN/control
版本在二进制控制文件中定义,在使用时提取dpkg-deb -R
。寻找一个Version:
字段:
Version: 1:2.5.2+v2.4-3+b1
您可以在此处编辑新包的版本号。 (您可以选择将更改日志条目添加到 中的更改日志中usr/share/doc/hostapd/changelog.Debian.gz
。)然后您可以像这样重建包,以便为dpkg-deb
您确定正确的文件名:
mkdir newpkg
dpkg-deb -b hostapd newpkg
这将在newpkg
目录中生成一个新的包,并适当命名。
理想情况下,您应该检查新二进制文件的库要求并更新依赖项信息control
!
答案2
以下是哪种手动编辑对我有用 - 然而,这是一种盲目的猜测,所以仍然很高兴能从了解该系统的人那里得到答案:
# decompress changelog.Debian.gz
unpack-hostapd$ gzip -d usr/share/doc/hostapd/changelog.Debian.gz
# edit the uncompressed changelog.Debian:
# add this on top:
# wpa (2.2) trusty-security; urgency=medium
#
# * whatever
#
# wpa (2.1-0ubuntu1.4) trusty-security; urgency=medium
# ....
unpack-hostapd$ nano usr/share/doc/hostapd/changelog.Debian
# repack changelog.Debian.gz
unpack-hostapd$ gzip -9 usr/share/doc/hostapd/changelog.Debian
# change DEBIAN/control - Source: and Version:
# change to:
# Source: wpa (2.2)
# Version: 1:2.2
unpack-hostapd$ nano DEBIAN/control
# repack .deb:
unpack-hostapd$ cd ..
$ dpkg-deb -b unpack-hostapd hostapd_1%3a2.2_amd64.deb
# now can install the deb
sudo dpkg -i hostapd_1%3a2.2_amd64.deb