根据Debian Policy Manual,我的postinst脚本在升级和配置时被调用,如“postinst configure old-version ”,其中旧版是以前安装的版本(可能为null)。我想确定 new-version ,即当前正在配置(升级到)的版本。
环境变量$DPKG_MAINTSCRIPT_PACKAGE
包含包名称;似乎没有等效的_VERSION
字段。 /var/lib/dpkg/status
在postinst运行后得到更新,所以我似乎也无法解析它。
有什么想法吗?
答案 0 :(得分:5)
我发现解决此问题的最佳方法是在.postinst
(或其他控制文件)中使用占位符变量:
case "$1" in
configure)
new_version="__NEW_VERSION__"
# Do something interesting interesting with $new_version...
;;
abort-upgrade|abort-remove|abort-deconfigure)
# Do nothing
;;
*)
echo "Unrecognized postinst argument '$1'"
;;
esac
然后在debian/rules
中,在构建时将占位符变量替换为正确的版本号:
# Must not depend on anything. This is to be called by
# binary-arch/binary-indep in another 'make' thread.
binary-common:
dh_testdir
dh_testroot
dh_lintian
< ... snip ... >
# Replace __NEW_VERSION__ with the actual new version in any control files
for pkg in $$(dh_listpackages -i); do \
sed -i -e 's/__NEW_VERSION__/$(shell $(SHELL) debian/gen_deb_version)/' debian/$$pkg/DEBIAN/*; \
done
# Note dh_builddeb *must* come after the above code
dh_builddeb
.postinst
中生成的debian/<package-name>/DEBIAN/postinst
代码段如下所示:
case "$1" in
configure)
new_version="1.2.3"
# Do something interesting interesting with $new_version...
;;
abort-upgrade|abort-remove|abort-deconfigure)
# Do nothing
;;
*)
echo "Unrecognized postinst argument '$1'"
;;
esac
答案 1 :(得分:3)
我在postinst脚本中使用以下有点脏命令:
NewVersion=$(zcat /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog.gz | \
head -1 | perl -ne '$_=~ /.*\((.*)\).*/; print $1;')
答案 2 :(得分:3)
VERSION=$(zless /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog* \
| dpkg-parsechangelog -l- -SVersion')
此处优于其他解决方案:
答案 3 :(得分:2)
将以下内容添加到debian/rules
:
override_dh_installdeb:
dh_installdeb
for pkg in $$(dh_listpackages -i); do \
sed -i -e 's/__DEB_VERSION__/$(DEB_VERSION)/' debian/$$pkg/DEBIAN/*; \
done
它将使用版本号替换debian脚本中出现的__DEB_VERSION__
。
答案 4 :(得分:1)
为什么不能在打包时将版本硬编码到postinst脚本中?
答案 5 :(得分:1)
在运行postinst之前,已经安装了所有软件包文件,并且dpkg的数据库已经更新,因此您可以使用以下命令获取刚刚安装的版本:
dpkg-query --show --showformat='${Version}' packagename
答案 6 :(得分:0)
试试这个:
VERSION=`dpkg -s $DPKG_MAINTSCRIPT_PACKAGE | sed -n 's/^Version: //p'`