哎哟。
“打包时间”与“安装时间”
您首先必须了解,构建 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。
例如。假设你正在构建两个包 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 并在安装过程中询问用户他们想要什么),您应该查看如何编写 maintainer scripts .
再想一想
但是,我认为您过度设计了一些东西。
/etc 目录是特殊的,因为它是为管理员 保留以适应他们的需要。
如果软件包在其中发生更改,则需要格外小心(因为这可能会撤消管理员所做的所有更改)。
如果你只是将文件安装到/etc/,debhelper 将应用额外的逻辑来保护那里的更改文件(基本上是询问管理员,他们是要保留旧文件还是安装新文件)。
但是如果你用自己的脚本绕过这个安全性,那么你很可能会破坏东西。