2017-12-27 89 views
0

我在macOS(Sierra)上使用nix軟件包管理器。在nix-store之外安裝文件的按摩軟件包

我的意圖是編寫一個nix表達式,將安裝現有的fish nix包以及Bass魚插件。

在Bass中沒有nixpkgs中的現有表達式,但git回購包含Makefile。此Makefile嘗試將文件複製到$HOME目錄。這是一個問題,因爲在nix-store之外安裝文件顯然是不可取的,並且在構建我的軟件包時未設置$HOME

我可以認識到爲什麼nix包在nix存儲之外安裝文件是不可取的 - 在功能編程方面它類似於副作用。但我也不清楚如何解決我的問題:

默認情況下魚需要插件,如低音安裝在$HOME/.config/fish/下。 Fish提供了一種通過指定環境變量XDG_CONFIG_HOME來自定義配置路徑的方法。所以我正在考慮做這樣的事情:

  1. 創建一個表達式,用來修補Makefile以安裝$ out下的文件。

  2. 創建一個表達式來安裝魚,並使用Bass作爲構建輸入。使用wrapProgram設置XDG_CONFIG_HOME指向nix存儲中的低音安裝路徑。

這聽起來像是正確的做法嗎?有解決這個問題的替代/更好的方法嗎?

感謝

+0

你的方法聽起來不錯。我說,試試吧。 –

回答

0

這是我已經有解決方案:

表達低音nix_local/pkgs/fish_plugins/bass/default.nix

{stdenv, fetchFromGitHub}: 

let 
    version = "0.0.1"; 

in 
stdenv.mkDerivation rec { 
    name = "bass-${version}"; 

    src = fetchFromGitHub { 
    owner = "edc"; 
    repo = "bass"; 
    rev = "1fbf1b66f52026644818016015b8fa9e0f639364"; 
    sha256 = "12bp8zipjbikasx20yz29ci3hikw0ksqlbxbvi2xgi4g6rmj7pxp"; 
    }; 

    patchPhase = '' 
    substituteInPlace Makefile --replace \ 
    "~/.config/fish" \ 
    $out/.config/fish 
    ''; 
} 

表達對fish_with_config: nix_local/pkgs/fish_with_config/default.nix

{stdenv, fish, bass, makeWrapper}: 

let 
    version = "0.0.1"; 

in 
stdenv.mkDerivation rec { 
    name = "fish-with-config-${version}"; 

    src = ./.; 

    buildInputs = [fish bass makeWrapper]; 

    installPhase = '' 
    mkdir -p $out/.config/fish/functions 

    cp -r $src/.config/* $out/.config 

    cp -r ${bass}/.config/fish/functions/* \ 
    $out/.config/fish/functions/ 

    mkdir -p $out/bin 
    ln -s ${fish}/bin/fish $out/bin/fish 

    wrapProgram $out/bin/fish --set XDG_CONFIG_HOME "$out/.config" 
    ''; 
} 

Fish程序被封裝以便它的配置存儲在nix存儲中。這使我們能夠從Bass符號鏈接功能,並且還可以從本地$src目錄複製任何其他配置文件。其他插件可以用相同的方式符號鏈接。

當地src dir來推導包含以下文件:

pkgs/fish_with_config 
├── .config 
│   └── fish 
│    ├── fishd.8c8590486f8c 
│    └── functions 
└── default.nix 

.config/fish/fishd.8c8590486f8c文件是一個「萬能變量文件」,這魚需要,以便操作。在標準Fish安裝中,該文件存儲在~/config/fish/下,並且在您首次進入交互模式時創建。隨着用戶與Fish設置進行交互,此文件的內容通常會隨着時間而改變。

fish_with_config派生將Fish配置存儲在nix-store中,這意味着它不能在後一個日期修改(不可寫)。這意味着所有配置設置都需要預先完成,因爲任何用戶嘗試修改設置都會導致許可錯誤 - 這顯然有點不方便,但對我來說不是一個阻礙。

可能值得注意的是,通用變量文件可能會隨着Fish的不同版本而改變,因此如果我要用較新版本的Fish構建fish_with_config,我將首先通過在nix-shell中運行魚來確定它的默認內容並在~/config/fish/下檢查自動生成的文件。

總之上述工作很好,我有權訪問bass和我選擇「烘烤」(pkgs/fish_with_config/.config/fish/functions)的任何其他用戶定義功能。

如果你看到任何可以改進或處理更多地方讓我知道。