在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
后,我在构建时仍然会遇到同样的错误,你不是说在安装时也会发生吗?