在debian/rules中创建符号链接时出错

在debian/rules中创建符号链接时出错,debian,symlink,Debian,Symlink,我正试图修改我的debian/rules文件以创建我的符号链接。 我的包有两个文件: /etc/logger-server1.json /etc/logger-server2.json 现在,在我的debian/rules文件中,我创建了以下条目: override_dh_install: dh_install if [ "$(PROJECT)" == "server1" ]; then \ echo "It is server1&quo

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

  • /etc/logger-server1.json
  • /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包和安装Debian包是有区别的

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

    但是,
    debian/rules
    中的脚本仅在构建过程中运行。安装软件包时不会执行这些命令

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

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

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

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

    幸运的是,
    dpkg buildpackage
    通常使用非root权限调用(现在)。通常不允许非超级用户在
    /etc
    中创建符号链接。 (类似地,您的脚本可能包含
    rm-r/
    不要运行此),如果您的用户有/有足够的电源,它将在构建软件包时擦除整个硬盘)

    使用
    dh_链接
    要在包中创建符号链接,请使用
    dh_-link
    ,使用
    debian/*.links

    例如,假设您正在构建两个包
    server1
    server2
    ,您将得到如下结果:

    $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
    ,并在安装过程中询问用户需要什么),您应该检查如何编写

    再想一想 然而,我认为你设计的东西太多了。
    /etc
    目录是特殊的,因为它是为管理员保留的,以适应他们的需要。 如果包更改了其中的内容,则需要格外小心(因为这可能会撤消管理员所做的所有更改)

    如果您只是将文件安装到
    /etc/
    ,debhelper将应用额外的逻辑来保护其中更改的文件(基本上是询问管理员,他们是想保留旧文件还是安装新文件)。
    但是,如果您使用自己的脚本绕过此安全性,则很有可能会破坏它。

    谢谢您的详细解释。是的,我不想在我编译的地方创建它,但我用
    sudo dpkg-I
    安装它(所以我有权限),但我不明白为什么在
    if
    语句
    ln-sf
    改成
    dh_link
    后,我在构建时仍然会遇到同样的错误,你不是说在安装时也会发生吗?