如何在nix文件中创建全局变量(或函数)?

srg*_*hma 4 nixos nix

我想声明变量,dotfiles_dir以便所有其他文件都可以看到并使用它。

例如(不工作)

/etc/nixos/configuration.nix(它是根文件,对吧?)

dotfiles_dir="/home/bjorn/.config/dotfiles";

import "${dotfiles_dir}/nixos/root/default.nix"
Run Code Online (Sandbox Code Playgroud)

并在~/.config/nixpkgs/home.nix(使用https://github.com/rycee/home-manager)中使用它

import "${dotfiles_dir}/nixos/home/default.nix"
Run Code Online (Sandbox Code Playgroud)

Emm*_*osa 6

我想声明变量 dotfiles_dir 以便所有其他文件都可以看到并使用它。

抱歉,但那是不可能的。在 Nix 中,不存在全局变量之类的东西。如果有的话,它将破坏它提供可重现构建的能力,因为那样 Nix 表达式将可以访问未声明的输入。

/etc/nixos/configuration.nix不是存储全局信息的地方,从技术上讲它是一个 NixOS 模块。但更重要的是,它是一个函数。

然而......有一种方法可以在一个地方定义一个值并在需要的地方使用它。像这样的东西:

/etc/nixos/dotfiles-dir.nix

"/home/bjorn/.config/dotfiles"
Run Code Online (Sandbox Code Playgroud)

〜/.config/nixpkgs/home.nix

let 
  dotfiles_dir = import /etc/nixos/dotfiles-dir.nix;
  dotfiles = import (builtins.toPath "${dotfiles_dir}/nixos/home/default.nix");
in 
...
Run Code Online (Sandbox Code Playgroud)

你还可以得到更多奇特的...

/etc/nixos/my-settings.nix

{ dotfiles_dir = "/home/bjorn/.config/dotfiles";
, some_other_value = "whatever";
}
Run Code Online (Sandbox Code Playgroud)

〜/.config/nixpkgs/home.nix

let 
  dotfiles_dir = (import /etc/nixos/my-settings.nix).dirfiles_dir;
  dotfiles = import (builtins.toPath "${dotfiles_dir}/nixos/home/default.nix");
in 
...
Run Code Online (Sandbox Code Playgroud)