Как сделать глобальную переменную (или функцию) в nix файле?

Я хочу объявить переменную dotfiles_dir, чтобы все остальные файлы могли ее видеть и использовать.

Например (не работает)

В /etc/nixos/configuration.nix (это корневой файл, да?)

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

import "${dotfiles_dir}/nixos/root/default.nix"

и используйте его также в ~/.config/nixpkgs/home.nix (с помощью https://github.com/rycee/home-manager)

import "${dotfiles_dir}/nixos/home/default.nix"

person srghma    schedule 04.11.2017    source источник


Ответы (1)


Я хочу объявить переменную dotfiles_dir, чтобы все остальные файлы могли ее видеть и использовать.

Извините, но это невозможно. В Nix нет такой вещи, как глобальные переменные. Если бы это было так, это разрушило бы его способность предоставлять воспроизводимые сборки, потому что тогда выражения Nix имели бы доступ к необъявленным входным данным.

/etc/nixos/configuration.nix - это не место для хранения глобальной информации, это технически модуль NixOS. Но что более важно, это функция.

Однако ... есть способ определить значение в одном месте и использовать его там, где оно вам нужно. Что-то вроде этого:

/etc/nixos/dotfiles-dir.nix

"/home/bjorn/.config/dotfiles"

~ / .config / nixpkgs / home.nix

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

Вы также могли бы получить больше фантазии ...

/etc/nixos/my-settings.nix

{ dotfiles_dir = "/home/bjorn/.config/dotfiles";
, some_other_value = "whatever";
}

~ / .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 
...
person Emmanuel Rosa    schedule 04.11.2017
comment
таким образом я должен везде носить путь к моим настройкам. Может быть, его можно сделать импортированным в шапку (например, { pkgs, mysettings, ... }:)? - person srghma; 05.11.2017
comment
Это синтаксис функции, а не импорта. Вы можете добавить mysettings в качестве аргумента функции, но вызывающий функцию должен будет предоставить для нее значение. То же самое работает и с пакетами, просто выражение верхнего уровня делает его несколько волшебным. Невозможно сказать сделать это значение доступным везде в Nix. - person Emmanuel Rosa; 05.11.2017