我刚刚创建了一个小型 DEB 包,只是想看看它是如何工作的。我的文件结构如下:
~/temp/myapp_1.0
▶ tree
.
├── DEBIAN
│ ├── control
│ └── postinst
└── usr
└── bin
├── myapp
├── myapp.deps.json
├── myapp.dll
├── myapp.pdb
└── myapp.runtimeconfig.json
基本上,我创建了一个 Hello-World dotnet 应用程序。我的control
文件只是:
Package: myapp
Version: 1.0
Maintainer: marcin
Architecture: all
Description: demo
我的postinst
是:
echo "echo (from postinst)"
我使用 创建了 DEB dpkg-deb --build myapp_1.0
,然后使用sudo dpkg -i myapp_1.0.deb
我看到它/usr/bin
如预期般包含了我应用程序的所有文件,并且该应用程序在使用时可以正常工作myapp
。
然后,我决定用 删除它sudo apt remove myapp
。它从 中删除了应用程序的所有文件/usr/bin
。我的问题是:它怎么知道哪些文件属于它?我以为它只会删除二进制文件/usr/bin/myapp
,但它也删除了myapp.dll
和所有其余文件。
是否总是apt remove something
会完全删除程序(并且apt purge something
还会删除所有配置)?它如何知道在哪里查找?它还会删除我的应用程序在运行时创建的文件吗?
答案1
“它如何知道要删除哪些文件?“ 与” 完全相同的问题它如何知道要安装哪些文件?“您在包结构中向 apt/dpkg 提供了该信息。
为了满足 Debian 标准,运行时创建的文件必须通过 prerm 脚本删除幂等性:apt install foo
随后apt remove foo
必须将系统恢复到安装之前的状态。
两个例外:
- /etc 中的文件是通过“purge”删除的,而不是通过“remove”删除的。
- apt/dpkg 永远不会删除 /home 中的文件。这些文件属于用户。
Apt/dpkg 没有任何设置可以只删除二进制文件并保留其他(非 /etc)文件。如果其他软件包依赖于某个库,则单独打包该库。
答案2
安装 deb 文件后,执行以下操作:
dpkg -L <packagename>
您将看到它列出了软件包的所有内容。这意味着系统知道软件包安装了哪些文件,因此知道要删除哪些文件。
此信息位于以下位置:
/var/lib/dpkg/info
对于每个包,都存在一个名为 packagename.list 的文件,其中包含与之前输出完全相同的信息dpkg -L
。