我有一个 debian 包,它将文件安装到/usr/local/java/jre/lib/ext
,其中/usr/local/java
是指向 jvm 实际安装位置的符号链接,在本例中是/usr/lib/jvm/java-6-sun
。
此软件包的新版本将 jar 安装在其他地方。问题是安装新版本会导致 dpkg 尝试自行清理,最终删除符号/usr/local/java
链接。
这是一种非常令人不快的状态,即使是暂时的。
我一直无法找到 dpkg 的标志来说服它保留符号链接,并且似乎无法在符号链接上设置不可变位。
以下是 debian 打包配置的更改:
diff --git a/debian/dirs b/debian/dirs
--- a/debian/dirs
+++ b/debian/dirs
@@ -1 +1 @@
-usr/local/java/jre/lib/ext
+usr/share/java
diff --git a/debian/rules b/debian/rules
--- a/debian/rules
+++ b/debian/rules
@@ -30,7 +30,7 @@ install: build
# Add here commands to install the package into debian/tmp.
# $(MAKE) pure_install
- cp thejar.jar $(TMP)/usr/local/java/jre/lib/ext
+ cp thejar.jar $(TMP)/usr/share/java
# Build architecture-independent files here.
binary-indep: build install
我想,保留usr/local/java/jre/lib/ext
它dirs
会产生预期的效果,但这只是将问题拖延下去——我宁愿这个包不负责维护符号链接。
那么:我有什么选择?
答案1
符号链接只是软件包安装的文件,因此适用正常行为。以下是我能想到的选项:
- 将符号链接标记为配置文件。我不知道这是否受支持,但如果受支持,则只有在清除包时才应删除符号链接。
- 不要将符号链接安装为文件,而是在 postinst 脚本中创建它。
- 只需手动创建符号链接,而不是将其作为包的一部分。
请注意,卸载旧版本时,符号链接指向的任何内容都将被删除,因此我看不出这有什么好处。
答案2
当我尝试引导基于 Debian 的发行版时遇到了这个问题。
我已经/bin
符号链接到usr/bin
。安装 dash 后,我的/bin
符号链接被替换为目录。
该--keep-directory-symlink
标志帮助我解决了这个问题。例如:
(cd /tmp; apt-get download dash)
dpkg-deb --fsys-tarfile /tmp/dash_*.deb | tar -x --keep-directory-symlink -C /chroot
答案3
如果您有 dpkg > 1.15.8,请尝试填充/etc/dpkg/dpkg.cfg.d/excludes
:
path-exclude=/usr/local/java/jre/lib/ext
来源:使用 dpkg 排除无用文件以节省磁盘空间 | Raphaël Hertzog。
对于 Arch 用户,请使用NoExtract=
in/etc/pacman.conf
并从路径中排除前导斜杠。请参阅维基百科或者man pacman.conf
。