2017-12-27 59 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)的任何其他用户定义功能。

如果你看到任何可以改进或处理更多地方让我知道。