2016-09-26 78 views
2

我想通過Nix來定義我的軟件的rc文件。因此,我定義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 
     ''; 
    }; 
} 

最後一部分缺失的是:將特定的環境變量添加到用戶默認shell,如CUSTOM_CONFIG_RC,這是相關程序的榮幸。

有人可以給我一個提示嗎?我剛剛開始掌握語言。

回答

2

典型的Nix方法是在不修改用戶的shell的情況下執行此操作,而是使用makeWrapper來封裝使用RC文件的程序。這樣,您的環境就不需要受到只有一個程序需要的變量的污染。

buildInputs = [ makeWrapper ]; 

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

不幸的是makeWrapper still isn't documented,但它的廣泛使用;我建議grep 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'不能影響'configuration.nix'中的'environment'變量? –

+0

1.不要改變軟件包,你可以將包裝後的程序作爲單獨的派生來避免重新編譯。 2.「一個地方」可以是這些腳本的目錄,例如'〜/ .nix-profile/share/rc-scripts/...'和你的'.bashrc'可以遍歷該目錄,並將它們全部來源。我並不完全遵循,但我認爲你說的是​​對的。就我所知,沒有直接的機制來設置您的基礎環境,並且我認爲這會與Nix哲學相違背。 –