调用脚本,安装到NixOS中

调用脚本,安装到NixOS中

我需要在 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' missingerror: 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"
    }
  ]
''

相关内容