问题描述
我正在尝试修改我的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
有什么办法解决吗?
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
。
例如。假设您要构建两个软件包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
,并在安装过程中询问用户他们想要什么),则应查看如何编写{ {3}}。
再想一次
但是,我认为您正在过度设计。
/etc
目录很特殊,因为它是管理员保留以适应其需要的目录。
如果软件包在其中进行了更改,则需要格外小心(因为这可能会撤消管理员所做的所有更改)。
如果您只是将文件安装到/etc/
, debhelper 将应用额外的逻辑来保护其中的更改文件(基本上是询问管理员,他们是否要保留旧文件或安装旧文件)。新文件)。
但是,如果您使用自己的脚本绕过此安全性,那么很有可能会破坏事情。