包管理器如何知道在哪里安装文件

How does a package manager know where to install files

问题基本上就是标题。也就是说,包管理器如何在 Linux 中说 apt 知道或决定安装文件的位置?

出现这个问题是因为例如您可以从 Makefile 进行构建,然后 运行 从执行构建的目录中执行可执行文件 -- 即没有执行安装的规则。或者可能有一个安装规则,但它是如何确定文件应该安装在哪里的?同样apt是安装一个包,但是安装文件的位置有什么规定?

you can for example do a build from a Makefile and then just run the executable from the directory where the build was performed

一些 程序是这样,通常是那些没有任何依赖项的程序。如果一个程序有它需要的其他文件,它需要知道在哪里可以找到它们。这样的路径在编译过程中被“烘焙”到可执行文件中,如果不重新编译程序就无法更改。

通常,这些文件的位置将在某些前缀下(例如 $PREFIX/bin$PREFIX/share/...$PREFIX/lib/...),并且程序将被配置为使用前缀configure 脚本,它创建 Makefile。默认前缀通常是根目录或 /usr,这就是为什么大多数可执行文件都在 /bin/usr/bin 中的原因。您可以使用 ./configure --prefix=$NEW_PREFIX.

设置不同的前缀

如果我不是 root,我会在 $HOME/.local 中安装我的大部分程序,所以我会在 /home/amadan/.local/bin/... 中获取我的可执行文件。随后的make在当前目录下编译程序,然后make install将所有东西放到配置的位置。

例如,ffmpeg有一堆依赖;例如,其中之一是 lib/libavcodec.a。如果我以用户身份编译它(使用 ./configure --prefix="$HOME/.local"),我会在 make install 完成它的工作后得到 /home/amadan/.local/lib/libavcodec.a(显然,/home/amadan/.local/bin/ffmpeg)。如果我尝试在它的构建位置 运行 ffmpeg,没有 make install,它不会工作,因为它会在错误的地方寻找它的支持文件。

That is, how does a package manager say apt in Linux know or decide where to install files?

包管理器本身没有。放置文件的位置在包内定义。确切的机制取决于包管理器。例如,apt 主要使用 .deb 文件,其中包含(在其他文件中)数据存档。数据存档(TAR 格式,可能是压缩的)将包含具有完整路径的文件,因此如果您将存档解压缩到根目录中,文件将放在它们所属的位置。

例如wget_1.21-1+deb11u1_arm64.deb包含data.tar.xz,其中包含:

./
./etc/
./etc/wgetrc
./usr/
./usr/bin/
./usr/bin/wget
...etc

apt 会将其解压到根文件夹中,最后得到 /usr/bin/wget.