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, которая соблюдается соответствующей программой.

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

1 ответ

Типичный способ Nix состоит в том, чтобы сделать это без изменения пользовательской оболочки, и вместо этого использовать makeWrapper обернуть программу, которая использует файл 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
Другие вопросы по тегам