2016-09-26 4 views
2

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

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

Тогда в пользовательской-конфигурации/default.nix файл определяется рядный:

{ stdenv }: 

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

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

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

ответ

2

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

buildInputs = [ makeWrapper ]; 

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

К сожалению, makeWrapper still isn't documented, но его широко используют; Я рекомендовал grepping для examples in the nixpkgs repo.


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

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 
+0

Хорошо, я вижу. Но использование «makeWrapper» приводит к перекомпиляции из источника всего пакета - в то время как единственное изменение, которое мне нужно, это переменная среды выполнения и добавленный файл? Второй совет: Да, если бы это было так ... не понравилось правильно ;-) Хотелось бы иметь все спецификации в одном месте. Правильно ли: «config.nix» не может влиять на переменную «environment», присутствующую в «configuration.nix»? –

+0

1. Вместо того, чтобы изменять пакет, вы можете сделать завернутую программу отдельным деривацией, чтобы избежать необходимости перекомпиляции. 2. «Одно место» может быть каталогом этих сценариев, например. '~/.nix-profile/share/rc-scripts/...' и ваш '.bashrc' мог бы перебирать этот каталог и выводить их все. 3. Я не совсем понимаю, но я думаю, что вы говорите правильно. Насколько я знаю, нет прямого механизма для настройки базовой среды из пакетов, и, на мой взгляд, это сломается с философией Nix. –