使用带有 `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 缺乏一个很好的接口来检查其内部结构,但它仍然是可能的。
我的服务
我在 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 缺乏一个很好的接口来检查其内部结构,但它仍然是可能的。