代码之家  ›  专栏  ›  技术社区  ›  Jim Merkel

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

  •  0
  • Jim Merkel  · 技术社区  · 2 年前

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

    出现这个问题的原因是,例如,您可以从Makefile进行构建,然后从执行构建的目录运行可执行文件——也就是说,没有进行安装的规则。或者可能有安装规则,但如何确定文件应安装在哪里?同样,apt也会安装软件包,但安装文件的规则是什么?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Amadan    2 年前

    例如,您可以从Makefile执行构建,然后从执行构建的目录运行可执行文件

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

    通常,这些文件的位置将位于某个前缀下(例如。 $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" ),我的结局是 /home/amadan/.local/lib/libavcodec.a 之后 制作安装 已经做到了(而且,很明显, /home/amadan/.local/bin/ffmpeg ).如果我想跑 ffmpeg 在它的建造位置,没有 制作安装 ,它将无法工作,因为它会在错误的位置查找支持文件。

    也就是说,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
    

    恰当的 将在根文件夹中提取此文件,然后 /usr/bin/wget .