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

时间:2017-07-17 13:59:39

标签: nix nixos

为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; ...}的{​​{1}}相关联,我被强制使用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 conf文件:

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

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

1 个答案:

答案 0 :(得分: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缺乏一个良好的界面来反省其内部,但它仍然是可能的。