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

Error while creating a symbolic link in debian/rules

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

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

但是,debian/rules 中存在的脚本在 build-process 期间仅 运行。它们不会在安装包时执行!

所以 debian/rules 实际上只是一个脚本(准确地说是一个 Makefile),也就是说 运行 当你 build 包来做所有的事情时繁重的工作。 此脚本的唯一目的是创建一个 .deb 文件。

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

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

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

幸运的是,dpkg-buildpackage 通常以 non-root 权力被调用(这些天)。 non-superusers 通常不允许在 /etc 中创建符号链接。 (同样,您的脚本可能包含 rm -r /不要 运行 THIS),如果您的用户 has/had足够的力量)。

使用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.

创建一个符号链接

如果你想让实际的决定成为 install-time 决定(例如,你正在安装一个包 myserver 并在安装过程中询问用户他们想要什么),你应该结帐maintainer scripts.

怎么写

再想想

但是,我认为您过度设计了一些东西。 /etc 目录比较特殊,因为它是为 管理员 保留的,可以根据他们的需要进行调整。 如果包在其中更改内容,则需要格外小心(因为这可能会撤消管理员所做的所有更改)。

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