问题基本上就是标题。也就是说,在Linux中,软件包管理器说apt如何知道或决定在哪里安装文件?
出现这个问题的原因是,例如,您可以从Makefile中进行构建,然后从执行构建的目录中运行可执行文件——也就是说,没有进行安装的规则。或者可能有一个安装规则,但它是如何确定文件应该安装在哪里的?同样,apt会安装软件包,但文件安装的规则是什么?
例如,您可以从Makefile进行构建,然后从执行构建的目录运行可执行文件
这对于一些程序是正确的,通常是那些没有任何依赖关系的程序。如果一个程序有它需要的其他文件,它需要知道在哪里可以找到它们。这样的路径是";烘烤成";编译中的可执行文件,并且在不重新编译程序的情况下无法更改。
通常,这些文件的位置将在某个前缀下(例如$PREFIX/bin
、$PREFIX/share/...
、$PREFIX/lib/...
),并且程序将被配置为通过创建Makefile
的configure
脚本使用前缀。默认前缀通常是根目录或/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/bin/ffmpeg
)之后,我最终会得到/home/amadan/.local/lib/libavcodec.a
。如果我尝试在其构建位置运行ffmpeg
,而没有make install
,它将无法工作,因为它会在错误的位置查找支持文件。
也就是说,在Linux中,包管理器如何说apt知道或决定在哪里安装文件?
包管理器本身没有。放置文件的位置是在包中定义的。确切的机制取决于包管理器。例如,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
。