假设我的NixOS configuration.nix设置如下:

{config, pkgs, ...}:
{
  services.openssh.enable = true;
}

我现在想拥有另一个名为networking.nix的文件,该文件根据一个参数设置我的主机名。
{config, pkgs, hostname, ...}:
{
  networking.hostName = hostname
}

这可能吗?如何包含文件。我已经尝试通过使用imports = [ ./networking.nix { hostname = "helloworld"; } ];来做到这一点,但这没有用。

谢谢。

最佳答案

您应该可以使用_module.args选项[1]来做到这一点。因此,您的configuration.nix类似于:

{config, pkgs, ...}:
{
  _module.args.hostname = "ahostname";
  services.openssh.enable = true;
}

但是,如果值非常简单,则直接设置它们可能会容易得多,例如只需在networking.hostname中定义configuration.nix即可。本部分手册重新。合并和优先级可能也会有所帮助[2]

进一步讨论:
_module.args的值确实适用于所有导入的配置(尽管该值仅在直接引用它的模块中使用,例如pkgs值,但...表示所有未引用的值)。

对于将参数传递给模块,这对我来说似乎是一种不错的方法,但是从您的评论中,也许使用其他方法可能更合适。

另一个解决方案可能是翻转导入中的关系:而不是传递多个不同参数的单个公共配置,而是多个不同的配置导入公共配置。例如。
$cat ./common.nix
{ services.openssh.enable = true; }
$cat ./ahostname.nix
{ imports = [ ./common.nix ]; networking.hostname = "ahostname"; }

this Reddit注释中的NixOS配置似乎使用了这种方法。人们在网上公开共享了许多其他NixOS配置,因此您可能会在其中找到一些有用的想法。罗伯特·亨辛(Robert Hensing)的答案中的几点也非常有用。

但是,很难在不进一步了解要使用它的上下文的情况下说出哪种解决方案是更好的解决方案。您可以创建一个新的SO问题,其中包含更多有关此问题的信息,这可能会使查看更合适的解决方案更加容易。

关于nixos - NixOS-带参数的模块导入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47650857/

10-13 05:12