包管理器如何知道在哪里安装文件
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
.
问题基本上就是标题。也就是说,包管理器如何在 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
.