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

问题描述

我正在尝试修改我的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

有什么办法解决吗?

P.s。
当我手动创建它时,它可以正常工作

解决方法

哎呀。

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

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

debian/rules的唯一目的是创建一个程序包。 它通常用于从源“构建”文件(例如,将文件编译为二进制文件;通常不是“直接”完成,而是通过调用要打包的源的构建系统),并以您可以将它们放入.deb存档中。 拥有.deb文件后,您可以将其安装在任何计算机上。 (通常,生成软件包的计算机不是安装软件包的目标计算机,而是 )。

但是,debian/rules中存在的脚本仅 在构建过程中运行。在安装软件包时不会执行它们!

因此debian/rules实际上只是一个脚本(准确地说是一个Makefile),当您 build 软件包执行所有繁重的工作时便会运行该脚本。 该脚本的唯一目的是创建一个.deb文件。

因此,无论您拥有的命令是什么,都将以运行用户的特权来执行。 这些命令可以是任意的,不需要与该软件包有任何关系。

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

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

幸运的是,dpkg-buildpackage通常是用非root用户权限(这些天)来调用的。非超级用户通常不允许在/etc中创建符号链接。 (简单地说,您的脚本可能包含rm -r /请勿运行),如果用户有/有足够的能力,它们只会在构建软件包时擦除整个硬盘。)

使用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,并在安装过程中询问用户他们想要什么),则应查看如何编写{ {3}}。

再想一次

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

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