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