在nix-store之外安装文件的按摩软件包

我在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存储中的低音安装路径。

这听起来像是正确的做法吗?有解决这个问题的替代/更好的方法吗?

感谢

回答:

这是我已经有解决方案:

表达低音: 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)的任何其他用户定义功能。

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

以上是 在nix-store之外安装文件的按摩软件包 的全部内容, 来源链接: utcz.com/qa/265601.html

回到顶部