![创建 .deb 后: dpkg: 删除时发出警告,目录 /usr/local/bin 不为空,因此未删除](https://linux22.com/image/58260/%E5%88%9B%E5%BB%BA%20.deb%20%E5%90%8E%EF%BC%9A%20dpkg%3A%20%E5%88%A0%E9%99%A4%E6%97%B6%E5%8F%91%E5%87%BA%E8%AD%A6%E5%91%8A%EF%BC%8C%E7%9B%AE%E5%BD%95%20%2Fusr%2Flocal%2Fbin%20%E4%B8%8D%E4%B8%BA%E7%A9%BA%EF%BC%8C%E5%9B%A0%E6%AD%A4%E6%9C%AA%E5%88%A0%E9%99%A4.png)
我已经从源创建了一个 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 目录:
答案1
一般来说,这个警告是完全无害且正常的。当dpkg
删除(或尝试删除)软件包时,它会删除作为该软件包安装的一部分创建的所有文件和目录。现在,假设在这种情况下目录中有一些文件可供删除,并且dpkg
不知道这些文件。发生这种情况的原因可能是它们是机器在安装期间或安装后生成的,也可能是因为它们是由用户创建的。然后,除非有指示,dpkg
否则不会删除这些文件。由于默认情况下,它不会删除非空目录,因此在这种情况下,包含这些文件的目录将不会被删除。因此,总而言之,删除软件包后,您最终可能会得到一个基本上空的目录(或多个目录),其中包含一些机器生成的文件或其他内容。这不是问题 - 您可以手动删除它们。
请注意,上面的默认值都是合理的默认值。这里没有错误。
就您而言,您将文件安装为/usr/local
Debian 二进制包的一部分,这违反了文件层次结构标准,并且错误的。不要这样做。用户二进制文件应该进入/usr/bin
,例如,库应该进入/usr/lib
,等等。我假设您的包创建了/usr/local/bin
,因为dpkg
自然地,它还不知道它。 (由于 Debian 软件包中包含文件/目录/usr/local
违反了 FHS,因此违反了 Debian 政策)。因此,它在删除包时会尝试删除该文件。停止安装/usr/local
,您的问题就会消失。
也许给我们更多的背景信息?您为什么要尝试构建自己的 zsh Debian 软件包而不是使用您的发行版附带的软件包?您使用的是哪种发行版?
如果您确实想这样做,这里有一个简单的提示。检查您的发行版(甚至 Debian)如何打包 zsh,然后重复使用该打包。它应该工作正常。没有理由尝试编写自己的代码,除非您想学习如何打包,但我认为这里的情况并非如此。