首页 文章

使用带有`nix-instantiate`的nix输入系统

提问于
浏览
1

myservice

我在 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 计算配置文件 .

how to evaluate that nginx.conf only?

@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 conf文件:

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

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

1 回答

  • 2

    我看到你的文件名是 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).*/\1/g'
      )
    

    因为 nginx.conf 文件是 nginx 模块专用的,所以我们不能直接引用它,但必须直接从使用站点提取它 .

    总的来说,NixOS缺乏一个良好的界面来反省其内部,但它仍然是可能的 .

相关问题