Nix: Может ли установленный пакет устанавливать переменную пользовательской среды?

Я хотел бы определить rc-файлы моего программного обеспечения через Nix. Поэтому я определяю новый пакет в config.nix, который будет содержать файл конфигурации:

{ pkgs, ... }:
{
packageOverrides = pkgs : with pkgs; {
  custom-config = import ./custom-config {
    inherit (pkgs) stdenv;
  };
};
}

Затем в custom-config / default.nix файл определяется встроенным:

{ stdenv }:

stdenv.mkDerivation rec {
  name = "custom-config";
  stdenv.mkDerivation {
    name = "CustomConfig";
    src = builtins.toFile "customrc" ''
      # content
      '';
  };
}

Последняя недостающая часть: Добавьте конкретную переменную среды в оболочку пользователя по умолчанию, например CUSTOM_CONFIG_RC, которая учитывается соответствующей программой.

Кто-нибудь может мне намекнуть? Я только начинаю понимать язык.


nix
person lksdfjöalksdjf    schedule 26.09.2016    source источник


Ответы (1)


Типичный способ Nix - сделать это без изменения оболочки пользователя и вместо этого использовать _ 1_, чтобы обернуть программу, использующую RC-файл. Таким образом, ваша среда не должна быть засорена переменными, которые нужны только одной программе.

buildInputs = [ makeWrapper ];

postInstall = ''
  wrapProgram "$out/bin/my-program" --set CUSTOM_CONFIG_RC "$rcFile"
'';

К сожалению, makeWrapper до сих пор не документирован, но широко используется; Я рекомендовал использовать grepping для примеров в репозитории nixpkgs.


Если вы действительно хотите, чтобы эта переменная была доступна в вашей среде, ваш вывод может сделать что-то вроде

postInstall = ''
  mkdir -p $out/share
  echo "export CUSTOM_CONFIG_RC=$rcFile" > $out/share/your-rc-setup-script.sh
'';

Когда пакет будет установлен, он получит символическую ссылку с ~/.nix-profile/share/your-rc-setup-script.sh, а затем в ваш .bashrc вы можете загрузить его с помощью

source $HOME/.nix-profile/share/your-rc-setup-script.sh
person Chris Martin    schedule 26.09.2016
comment
Да я вижу. Но использование makeWrapper приводит к перекомпиляции всего пакета из источника - в то время как единственное изменение, которое мне нужно, - это переменная среды выполнения и добавленный файл? Второй совет: да, было вот так ... не по вкусу ;-) Хотелось бы собрать все спецификации в одном месте. Верно ли, что: «config.nix» не может влиять на переменную «окружение», присутствующую в «configuration.nix»? - person lksdfjöalksdjf; 27.09.2016
comment
1. Вместо изменения пакета вы можете сделать упакованную программу отдельной производной, чтобы избежать необходимости перекомпиляции. 2. Одно место может быть каталогом этих скриптов, например. ~/.nix-profile/share/rc-scripts/... и ваш .bashrc могут пройти через этот каталог и получить их все. 3. Я не совсем понимаю, но думаю, что то, что вы говорите, правильно. Насколько мне известно, нет прямого механизма для настройки вашей базовой среды из пакетов, и, на мой взгляд, это противоречило бы философии Nix. - person Chris Martin; 27.09.2016
comment
Мне было интересно, если у вас есть пакет Python с несколькими сценариями, и все ожидают, что при его вызове будет использоваться какая-то переменная среды, можно ли использовать makeWrapper в каждом из сценариев? Или есть способ обернуть все скрипты за один раз? - person CMCDragonkai; 18.07.2018