【发布时间】:2017-11-27 21:54:10
【问题描述】:
我正在学习如何使用 Nix/NixOs/NixOps,但在重构一个简单的 NixOps 部署时遇到了麻烦。
我的出发点是这个工作 vbox-all.nix 文件:
{
server =
{ config, pkgs, ... }:
{
# deployment-specific config
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # megabytes
deployment.virtualbox.vcpu = 2; # number of cpus
# postgres-specific config
services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql96;
# htop-specific config
environment.systemPackages =
[
pkgs.htop
];
};
}
运行nixops create ./vbox.nix -d mydeployment 然后nixops deploy -d mydeployment 运行良好:我得到一台运行Postgres 9.6 并安装htop 的VirtualBox 机器。
现在,将所有这些都放在一个文件中似乎不是长期维护的好主意。
这是我想要的文件布局:
.
├── configuration-all.nix # forms a NixOs config with htop, postgres, etc.
├── htop.nix # NixOs config of just htop
├── postgres.nix # NixOs config of just Postgres
└── vbox-all.nix # NixOps config for virtualbox with htop, postgres, etc.
这个想法是 vbox-all.nix 导入 configuration-all.nix 导入我可能想要的所有服务/包/conf(当前是 postgres 和 htop)。
这就是我无法工作的原因。
这是我的configuration-all.nix:
{ config, pkgs, ... }:
{
imports = [ ./postgres.nix ./htop.nix ];
}
这里是./postgres.nix:
{ config, pkgs, ... }:
{
services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql96;
}
我想./htop.nix的内容你可以猜到,反正也无所谓。
最后,我修改后的vbox-all.nix:
{
server =
{ config, pkgs, ... }:
with (pkgs.callPackage ./configuration-all.nix { });
{
# deployment-specific config
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # megabytes
deployment.virtualbox.vcpu = 2; # number of cpus
};
}
当我重新运行 nixops deploy -d mydeployment 时,我没有收到任何错误,但生成的 VM 既没有 postgres 也没有 htop。
我必须从根本上误解with 或callPackage。对我来说,它应该:执行./configuration-all.nix 中定义的函数(自动填充所有参数)并将结果表达式与我的“特定于部署的配置”合并。
我尝试了一些方法,例如:用import 替换pkgs.callPackage(仍然没有错误,但仍然不好),使用inherit (pkgs.callPackage ./configuration-all.nix { }) 而不是with 等,但到目前为止还没有骰子。
我一定遗漏了一些小东西,而且可能很明显......
【问题讨论】: