在 debian/rules 中创建符号 link 时出错
Error while creating a symbolic link in debian/rules
我正在尝试修改我的 debian/rules
文件以创建符号 link。
我的包裹有两个文件:
/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
的唯一目的是创建 一个包。
它通常用于从源“构建”文件(例如,将文件编译成二进制文件;通常这不是“直接”完成的,而是通过调用您正在打包的源的 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
.
例如。假设你正在构建两个包 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.
创建一个符号链接
如果你想让实际的决定成为 install-time 决定(例如,你正在安装一个包 myserver
并在安装过程中询问用户他们想要什么),你应该结帐maintainer scripts.
怎么写
再想想
但是,我认为您过度设计了一些东西。
/etc
目录比较特殊,因为它是为 管理员 保留的,可以根据他们的需要进行调整。
如果包在其中更改内容,则需要格外小心(因为这可能会撤消管理员所做的所有更改)。
如果您只是将文件安装到 /etc/
,debhelper 将应用额外的逻辑来保护其中已更改的文件(基本上询问管理员,他们是否要保留旧文件或安装新文件)。
但是,如果您使用自己的脚本绕过此安全措施,那么您破坏的可能性就很高。
我正在尝试修改我的 debian/rules
文件以创建符号 link。
我的包裹有两个文件:
/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
的唯一目的是创建 一个包。
它通常用于从源“构建”文件(例如,将文件编译成二进制文件;通常这不是“直接”完成的,而是通过调用您正在打包的源的 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
.
例如。假设你正在构建两个包 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.
如果你想让实际的决定成为 install-time 决定(例如,你正在安装一个包 myserver
并在安装过程中询问用户他们想要什么),你应该结帐maintainer scripts.
再想想
但是,我认为您过度设计了一些东西。
/etc
目录比较特殊,因为它是为 管理员 保留的,可以根据他们的需要进行调整。
如果包在其中更改内容,则需要格外小心(因为这可能会撤消管理员所做的所有更改)。
如果您只是将文件安装到 /etc/
,debhelper 将应用额外的逻辑来保护其中已更改的文件(基本上询问管理员,他们是否要保留旧文件或安装新文件)。
但是,如果您使用自己的脚本绕过此安全措施,那么您破坏的可能性就很高。