创建 .deb 后: dpkg: 删除时发出警告,目录 /usr/local/bin 不为空,因此未删除

创建 .deb 后: dpkg: 删除时发出警告,目录 /usr/local/bin 不为空,因此未删除

我已经从源创建了一个 zsh 5.0.7 包,现在我可以成功安装它,但是当我尝试删除它时,我得到以下信息:

$ sudo dpkg -i zsh_5.0.7_amd64.deb
Selecting previously unselected package zsh.
(Reading database ... 177638 files and directories currently installed.)
Preparing to unpack zsh_5.0.7_amd64.deb ...
Unpacking zsh (5.0.7) ...
Setting up zsh (5.0.7) ...
Processing triggers for man-db (2.7.0.2-2) ...
Reading package lists...
Building dependency tree...
$ sudo apt-get purge zsh
Reading state information...
The following packages will be REMOVED:
  zsh*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 6473 kB disk space will be freed.
Do you want to continue? [Y/n] (Reading database ... 178746 files and directories currently installed.)
Removing zsh (5.0.7) ...
dpkg: warning: while removing zsh, directory '/usr/local/bin' not empty so not removed
dpkg: warning: while removing zsh, directory '/usr/local/lib' not empty so not removed
dpkg: warning: while removing zsh, directory '/usr/local/share/man/man1' not empty so not removed
Processing triggers for man-db (2.7.0.2-2) ...

我可以在包装(debian/{control,rules}或其他文件)中更改哪些内容以使该警告消失?

debian/control

Source: zsh
Section: unknown
Priority: optional
Maintainer: Patryk <[email protected]>
Build-Depends: debhelper (>= 8.0.0), autotools-dev
Standards-Version: 3.9.4
Homepage: http://zsh.sourceforge.net/

Package: zsh
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, libc6
Description: ZSH shell
 Zsh is a shell designed for interactive use, although it is also a powerful scripting language. Many of the useful features of bash, ksh, and tcsh were incorporated into zsh; many original features were added.

debian/rules

#!/usr/bin/make -f
# -*- makefile -*-

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

%:
        dh $@  --with autotools-dev
override_dh_auto_configure:
        ./configure
override_dh_usrlocal:

编辑

我已经分叉了 zsh 源并添加了用于打包的 debian 目录:

https://github.com/pmalek/zsh/tree/5.0.7-deb/debian

答案1

一般来说,这个警告是完全无害且正常的。当dpkg删除(或尝试删除)软件包时,它会删除作为该软件包安装的一部分创建的所有文件和目录。现在,假设在这种情况下目录中有一些文件可供删除,并且dpkg不知道这些文件。发生这种情况的原因可能是它们是机器在安装期间或安装后生成的,也可能是因为它们是由用户创建的。然后,除非有指示,dpkg否则不会删除这些文件。由于默认情况下,它不会删除非空目录,因此在这种情况下,包含这些文件的目录将不会被删除。因此,总而言之,删除软件包后,您最终可能会得到一个基本上空的目录(或多个目录),其中包含一些机器生成的文件或其他内容。这不是问题 - 您可以手动删除它们。

请注意,上面的默认值都是合理的默认值。这里没有错误。

就您而言,您将文件安装为/usr/localDebian 二进制包的一部分,这违反了文件层次结构标准,并且错误的。不要这样做。用户二进制文件应该进入/usr/bin,例如,库应该进入/usr/lib,等等。我假设您的包创建了/usr/local/bin,因为dpkg自然地,它还不知道它。 (由于 Debian 软件包中包含文件/目录/usr/local违反了 FHS,因此违反了 Debian 政策)。因此,它在删除包时会尝试删除该文件。停止安装/usr/local,您的问题就会消失。

也许给我们更多的背景信息?您为什么要尝试构建自己的 zsh Debian 软件包而不是使用您的发行版附带的软件包?您使用的是哪种发行版?

如果您确实想这样做,这里有一个简单的提示。检查您的发行版(甚至 Debian)如何打包 zsh,然后重复使用该打包。它应该工作正常。没有理由尝试编写自己的代码,除非您想学习如何打包,但我认为这里的情况并非如此。

相关内容