使用带有 `nix-instantiate` 的 nix 打字系统

using the nix typing system with `nix-instantiate`

我的服务

我在 myservice.nix 中编写了一个 nixos 服务,并将其包含在 /etc/nixos/configuration.nix 中:

imports [ /path/to/myservice.nix ]; 

后来我在里面使用它 configuration.nix:

services.myservice.enable = true;

问题

在一种情况下我不能使用 nixos-rebuild switch 但因为输入 nix 链接到 options system 使用 foo = mkOption { type = types.int; ...} 我被迫使用 options systems 即使我只想使用 nix 计算 nginx 的配置文件。

如何评价那只nginx.conf?

@aszlig 给我写了这个命令:

nix-instantiate --eval --strict -E '(import <nixpkgs/nixos> { configuration = { imports = [ nixcloud-reverse-proxy/nixcloud-reverse-proxy.nix ]; services.nixcloud-reverse-proxy.enable = true; }; }).config.system.build.configsFromPath'

执行结果

nix-instantiate --eval --strict -E '(import <nixpkgs/nixos> { configuration = { imports = [ ./nixcloud-reverse-proxy.nix ]; services.nixcloud-reverse-proxy.enable = true; }; }).config.system.build.configsFromPath'
error: attribute ‘configsFromPath’ missing, at (string):1:1
(use ‘--show-trace’ to show detailed location information)

更新

nix-build '<nixpkgs/nixos>' -A config.systemd.services.nixcloud-reverse-proxy.runner -I nixos-config=./configuration.nix
...
/nix/store/lp2jbb1wahhlr7qkq81rmfvk84mjk1vk-nixcloud-reverse-proxy-runner

现在我可以用它来 grep 配置文件了:

cat /nix/store/lp2jbb1wahhlr7qkq81rmfvk84mjk1vk-nixcloud-reverse-proxy-runner  | grep -o ' /nix/store/.*nginx-reverse-proxy.conf'

... 一种解决方法,但不是很精确!我更喜欢目录中的配置文件。

我看到你的文件名为 nginx-reverse-proxy.conf,所以它不是用花哨的 NixOS 模块系统构建的,而是用其他一些方式构建的。在这种情况下(您可以控制构建文件的方式),您可以将其全局包含:

 environment.etc."myconfigs"."nginx-reverse-proxy.conf".text = ...content of that file;

你推荐哪个

$ nix-instantiate --eval -E '
   with import <nixpkgs/nixos> {
       configuration = { ... };
   };
   config.environment.etc."myconfigs"."nginx-reverse-proxy.conf".text
  '

您可能需要使用 https://gist.github.com/danbst/a9fc068ff26e31d88de9709965daa2bd

中描述的技巧来解码该输出

这本身就是一种复杂的做法

$ cat $(nix-build -E '
    with import <nixpkgs/nixos> {
      configuration = { ... };
    };
    config.environment.etc."myconfigs"."nginx-reverse-proxy.conf".source
  ')

如果您的代理配置是通用 nginx.conf 脚本的一部分,那么您仍然可以使用

获取它
$ cat $(cat $(nix-build -E '
     with import <nixpkgs/nixos> {
       configuration = ...;
     };
     config.system.build.units."nginx.service".unit
   ')/nginx.service \
    | grep nginx.conf \
    | sed -r 's/.* (.*nginx.conf).*//g'
  )

因为nginx.conf 文件是nginx 模块的私有文件,我们不能直接引用它,而必须直接从使用站点提取它。

总的来说,NixOS 缺乏一个很好的接口来检查其内部结构,但它仍然是可能的。