首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有“nix -实例化”的nix类型系统

使用带有“nix -实例化”的nix类型系统
EN

Stack Overflow用户
提问于 2017-07-17 13:59:39
回答 1查看 282关注 0票数 1

我的服务

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

代码语言:javascript
复制
imports [ /path/to/myservice.nix ]; 

稍后,我在configuration.nix中使用它

代码语言:javascript
复制
services.myservice.enable = true;

问题

在一个场景中,我不能使用nixos-rebuild switch,但是由于输入nix是通过foo = mkOption { type = types.int; ...}链接到options system的,所以我不得不使用options systems,即使我只想使用nix为nginx计算一个配置文件。

如何评估nginx.conf?

@aszlig给我写了这个命令:

代码语言:javascript
复制
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'

执行结果

代码语言:javascript
复制
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)

更新

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
cat /nix/store/lp2jbb1wahhlr7qkq81rmfvk84mjk1vk-nixcloud-reverse-proxy-runner  | grep -o ' /nix/store/.*nginx-reverse-proxy.conf'

..。这是一种解决办法,但不是很精确!我希望目录中有一个配置文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-10 00:01:21

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

代码语言:javascript
复制
 environment.etc."myconfigs"."nginx-reverse-proxy.conf".text = ...content of that file;

你指的是

代码语言:javascript
复制
$ nix-instantiate --eval -E '
   with import <nixpkgs/nixos> {
       configuration = { ... };
   };
   config.environment.etc."myconfigs"."nginx-reverse-proxy.conf".text
  '

您可能需要通过使用https://gist.github.com/danbst/a9fc068ff26e31d88de9709965daa2bd中描述的技巧来解码输出

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

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

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

代码语言:javascript
复制
$ 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缺乏一个很好的界面来内省它的内部,但它仍然是可能的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45146294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档