我需要在 NixOS 中创建 shell 脚本,然后以声明方式使用它。对于这种情况,NixOS 可以在系统内部提供 shell 脚本,但我在安装后调用此脚本时遇到了麻烦。为了将 shell 脚本放入系统内部,我使用了以下代码片段:
{ pkgs, ... }:
let
helloWorld = pkgs.writeScriptBin "helloWorld" ''
#!${pkgs.stdenv.shell}
echo Hello World
'';
in {
environment.systemPackages = [ helloWorld ];
}
名为的包helloWorld
已成功安装到系统中,但是,当我尝试将其放入另一个文件中时,这样
environment.etc."webhook.conf".text = ''
[
{
"id": "webhook",
"execute-command": "${pkgs.systemPackages}/bin/helloWorld",
"command-working-directory": "/tmp"
}
]
或者
environment.etc."webhook.conf".text = ''
[
{
"id": "webhook",
"execute-command": "${pkgs.helloWorld}/bin/helloWorld",
"command-working-directory": "/tmp"
}
]
它nixos-rebuild switch
会遇到这个错误:(error: attribute 'systemPackages' missing
或error: attribute 'helloWorld' missing
对于第二种调用变体)
我做错了什么?我需要 helloWorld包的路径出现在目录webhook.conf
中的文件中/etc
答案1
嗯,pkgs 不是那样工作的,向 systemPackages 选项添加一个元素,并不会将其作为条目添加在 pkgs 属性集中。
有两种可能的方法可以实现这一点。
第一种方法是在需要的地方定义 helloWorld 脚本,如下所示:
environment.etc."webhook.conf".text = let
helloWorld = pkgs.writeScriptBin "helloWorld" ''
echo Hello World
'';
in ''
[
{
"id": "webhook",
"execute-command": "${helloWorld}/bin/helloWorld",
"command-working-directory": "/tmp"
}
]
''
这样做之后,helloWorld存储路径仅被称为局部变量helloWorld,您可以使用它将其包含在/etc中的文件中。
或者,您可以将脚本添加到 environment.systemPackages,这将使 helloWorld 脚本在系统路径上可用,这样您就可以直接编写 helloWorld 并依靠标准路径解析为您找到脚本,如下所示:
environment.systemPackages = let
helloWorld = pkgs.writeScriptBin "helloWorld" ''
echo Hello World
'';
in [ helloWorld ];
environment.etc."webhook.conf".text = ''
[
{
"id": "webhook",
"execute-command": "helloWorld",
"command-working-directory": "/tmp"
}
]
''