【问题标题】:Error while creating a symbolic link in debian/rules在 debian/rules 中创建符号链接时出错
【发布时间】:2021-02-04 02:05:54
【问题描述】:

我正在尝试修改我的 debian/rules 文件以创建我的符号链接。
我的包有两个文件:

  1. /etc/logger-server1.json
  2. /etc/logger-server2.json

现在在我的debian/rules 文件中,我创建了以下条目:

override_dh_install:
dh_install
if [ "$(PROJECT)" == "server1" ]; then \
    echo "It is server1"
    ln -sf /etc/logger-server1.json /etc/logger-cfg.json
else
    echo "It is server2"
    ln -sf /etc/logger-server2.json /etc/logger-cfg.json
fi

但是当我编译它时,我得到了以下错误:

install: cannot stat 'etc/logger-cfg.json': No such file or directory
Makefile:167: recipe for target 'install' failed

有什么办法可以解决吗?

附言
当我手动创建它时,它正在工作

【问题讨论】:

    标签: debian symlink


    【解决方案1】:

    哎哟。

    “打包时间”与“安装时间”

    您首先必须了解,构建 Debian 软件包和安装它是有区别的。

    debian/rules 的唯一目的是创建一个包。 它通常用于从源“构建”文件(例如,将文件编译为二进制文件;通常这不是“直接”完成的,而是通过调用您正在打包的源的构建系统),并以这样的方式排列它们:您可以将它们放入.deb 存档。 一旦你有了.deb 文件,你就可以在任何机器上安装它。 (通常,您构建包的机器不是您安装包的目标机器)

    但是,debian/rules 中的脚本在构建过程中运行。安装包时不执行!

    所以debian/rules 实际上只是一个脚本(准确地说是一个 Makefile),它在您构建 包以完成所有繁重工作时运行。 此脚本的唯一目的是创建一个.deb 文件。

    因此,无论您在其中使用什么命令,都将以运行用户的权限执行。 命令可以是任意的,不需要与手头的包有任何关系。

    在您的具体示例中,ln -sf /etc/logger-server1.json /etc/logger-cfg.json 将尝试在 您构建包的机器的/etc 目录中创建符号链接

    这很可能不是您想要的。我猜你想要做的是在包中创建一个符号链接(也就是说:你希望在安装包的每台机器上都有一个符号链接)。

    幸运的是,dpkg-buildpackage 通常以非 root 权限调用(这些天)。非超级用户通常不允许在/etc 中创建符号链接。 (类似地,您的脚本可能包含 rm -r / (DO NOT RUN THIS),如果您的用户有/有足够的权力,它只会在构建软件包时清除您的整个硬盘)。

    使用dh_link

    为了在你的包中创建符号链接,使用dh_link,使用debian/*.links

    例如。假设你正在构建两个包 server1server2 你会得到类似的东西:

    $ cat debian/server1.links
    /etc/logger-server1.json /etc/logger-cfg.json
    $ cat debian/server2.links
    /etc/logger-server2.json /etc/logger-cfg.json
    

    所以如果你安装server1包,它会从/etc/logger-server1.json创建一个符号链接,如果你安装server2包,它会创建一个符号链接来自 /etc/logger-server2.json

    如果您想在安装时做出实际决定(例如,您正在安装单个软件包 myserver 并在安装过程中询问用户他们想要什么),您应该查看如何编写 maintainer scripts .

    再想一想

    但是,我认为您过度设计了一些东西。 /etc 目录是特殊的,因为它是为管理员 保留以适应他们的需要。 如果软件包在其中发生更改,则需要格外小心(因为这可能会撤消管理员所做的所有更改)。

    如果你只是将文件安装到/etc/debhelper 将应用额外的逻辑来保护那里的更改文件(基本上是询问管理员,他们是要保留旧文件还是安装新文件)。 但是如果你用自己的脚本绕过这个安全性,那么你很可能会破坏东西。

    【讨论】:

    • 感谢您的详细解释。是的,我不想在我编译的地方创建它,而是在我用sudo dpkg -i 安装它的地方(所以我有权限),但我不明白为什么在我将if 语句ln -sf 更改为@ 之后987654347@我在构建时仍然遇到同样的错误,你不是说安装时也会发生吗?
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2013-01-06
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多