2017-02-10 55 views
0

问题

我一直工作在一个Web服务器的抽象,但使用lib.mapAttrsToList总是返回一个无限递归错误:lib.mapAttrsToList和无限递归

# nixos-rebuild build 
building Nix... 
error: infinite recursion encountered, at /nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/lib/modules.nix:59:71 
(use ‘--show-trace’ to show detailed location information) 
error: infinite recursion encountered, at /nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/lib/modules.nix:59:71 
(use ‘--show-trace’ to show detailed location information) 
building the system configuration... 
error: infinite recursion encountered, at /nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/lib/modules.nix:59:71 
(use ‘--show-trace’ to show detailed location information) 

我已经添加的所有其他版本代码,没有返回infinite recursion错误,这是我不明白。

所以这里是我的代码:

configuration.nix

imports = 
    [ # Include the results of the hardware scan. 
     ./hardware-configuration.nix 
     /home/joachim/Desktop/projects/nixcloud/nixcloud-webservices-abstraction/nextcloud.nix 
    ]; 

    services.nextcloud = { 
    enable=true; 
    networks = { 
     net1 = { name = "foo"; }; 
     net2 = { name = "bar"; }; 
    }; 

nixcloud.nix

{ config, options, lib, pkgs, ... }: 

with lib; 

let 
    mergeListToAttrs = fold (c: el: recursiveUpdate el c) {}; 
    cfg = config.services.nextcloud; 
in 

{ 
options = { 
    services.nextcloud = { 
     networks = mkOption { 
     default = {}; 
#   type = types.loaOf types.submodule; 
     options = { 
      name = mkOption { 
      default = ""; 
      type = types.str; 
      }; 
     }; 
     }; 
     enable = mkOption { 
     default = true; 
     type=types.bool; 
     description = '' 
      Whether to enable the cntlm, which start a local proxy. 
     ''; 
     }; 
    }; 
    }; 

# example 1 - works 
# config = { 
#  systemd.services = { 
#  bar = { 
#   wantedBy  = [ "multi-user.target" ]; 
#   after   = [ "" ]; 
#  }; 
#  foo = { 
#   wantedBy  = [ "multi-user.target" ]; 
#   after   = [ "" ]; 
#  }; 
#  }; 
# }; 



# example 2 - works 
# config = { 
#  systemd.services = lib.flip lib.mapAttrs cfg.networks (network: data: 
#  { 
#   wantedBy  = [ "multi-user.target" ]; 
#   after   = [ "network.target" ]; 
#   serviceConfig = { 
#    ExecStart = ""; 
#    ExecReload = ""; 
#    Restart = "always"; 
#    RestartSec = "10s"; 
#    StartLimitInterval = "1min"; 
#   }; 
#  } 
# ); 
# }; 


# example 3 - works  
# config = { 
#  systemd.services = flip mapAttrs' cfg.networks (network: data: nameValuePair 
#  ("tinc.${network}") 
#  ({ 
#    wantedBy  = [ "multi-user.target" ]; 
#    after   = [ "network.target" ]; 
#    serviceConfig = { 
#    ExecStart = ""; 
#    ExecReload = ""; 
#    Restart = "always"; 
#    RestartSec = "10s"; 
#    StartLimitInterval = "1min"; 
#    }; 
#   }) 
#  ); 
# }; 

# example 4 - works  
#  config = 
#  mergeListToAttrs (
#   [ 
#   { systemd.services.a = { 
#    wantedBy  = [ "multi-user.target" ]; 
#    after   = [ "network.target" ]; 
#    serviceConfig = { 
#    ExecStart = ""; 
#    ExecReload = ""; 
#    Restart = "always"; 
#    RestartSec = "10s"; 
#    StartLimitInterval = "1min"; 
#    }; 
#   }; 
#   } 
#   { 
#   systemd.services.b = { 
#    wantedBy  = [ "multi-user.target" ]; 
#    after   = [ "network.target" ]; 
#    serviceConfig = { 
#    ExecStart = ""; 
#    ExecReload = ""; 
#    Restart = "always"; 
#    RestartSec = "10s"; 
#    StartLimitInterval = "1min"; 
#    }; 
#   }; 
#   } 
#   ]); 

# example 5 - fails! 
# XXXXXXXX the failing function XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
    config = 
     mergeListToAttrs (
     lib.flip lib.mapAttrsToList cfg.networks (wsName: wsConfig: { 
      systemd.services.${wsName} = { 
      wantedBy  = [ "multi-user.target" ]; 
      after   = [ "network.target" ]; 
      serviceConfig = { 
       ExecStart = ""; 
       ExecReload = ""; 
       Restart = "always"; 
       RestartSec = "10s"; 
       StartLimitInterval = "1min"; 
      }; 
      }; 
     }) 
    ); 

} 
+1

据我可以看到唯一的区别是'mergeListToAttrs'函数;如果您替换它会发生什么,例如由'头'? – Profpatsch

回答

0

根据aszlig问题是example 5变化,并从配置在读同时。解决方法是不这样做,但要么使用硬编码的'右侧值',如example 4或将systemd.services =指定为右侧值。