использование системы ввода nix с `nix-instantiate`

myservice

Я написал службу nixos в myservice.nix и включил ее в /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, хотя я просто хочу вычислить файл конфигурации для nginx с помощью nix.

как оценить только этот 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'

... своего рода обходной путь, но не очень точный! я бы предпочел файл конфигурации в каталоге.


person qknight    schedule 17.07.2017    source источник
comment
умно: nix-build '‹nixpkgs / nixos›' -A config.systemd.services.nixcloud-reverse-proxy.runner -I nixos-config = / etc / nixos / configuration.nix   -  person qknight    schedule 17.07.2017


Ответы (1)


Я вижу, что имя вашего файла 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 не хватает хорошего интерфейса для внутреннего анализа, но это все же возможно.

person danbst    schedule 10.09.2017