按摩尼克斯商店之外安装文件的软件包



我正在使用macos(sierra)上的nix package-manager。

我的目的是编写一个Nix表达式,该表达式将与贝斯鱼插件一起安装现有的Fish Nix包装。

低音中的nixpkgs中没有现有的表达式,但是git repo包含一个makefile。此MakeFile尝试将文件复制到$HOME DIR。这是一个问题,因为显然不希望安装文件,并且当我构建程序包时未设置$HOME

我可以识别为什么Nix软件包不希望在Nix商店之外安装文件 - 在功能编程术语中,它类似于副作用。但是我也不清楚如何解决我的问题:

默认情况下,鱼需要在$HOME/.config/fish/下安装诸如低音之类的插件。FISH确实提供了一种通过指定环境变量XDG_CONFIG_HOME来自定义配置路径的方法。所以我正在考虑这样做:

  1. 创建一个表达式,用于在$ out下安装文件。

  2. 创建一个安装鱼并使用低音作为构建输入的表达式。使用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"
  '';
}

将鱼程序包裹起来,以便将其配置存储在Nix商店中。这使我们能够从低音中链接功能,还可以从本地$src DIR复制任何其他配置文件。可以以相同的方式对其他插件进行链接。

该派生的本地src DIR包含以下文件:

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

.config/fish/fishd.8c8590486f8c文件是鱼类需要操作所需的"通用变量文件"。在标准鱼安装中,此文件是在~/config/fish/下存储的,并在您首次输入交互式模式时创建。当用户与鱼类设置互动时,该文件的内容通常会随着时间而变化。

fish_with_config推导将鱼类配置存储在Nix商店中,这意味着无法在后期(不写)进行修改。这意味着所有配置设置都需要预先完成,因为用户修改设置的任何尝试都会导致许可错误 - 这显然有些不便,但对我来说不是表演的阻止者。

可能值得注意的是,通用变量文件可能会随着不同的鱼类发行而改变,因此,如果我要用较新的鱼类构建fish_with_config,我首先会通过在Nix-Shell中运行鱼和在~/config/fish/下检查自动生成的文件。

总而言之,上述很好,我可以访问bass,并且我选择"烘烤"的任何其他用户定义的功能(pkgs/fish_with_config/.config/fish/functions)。

如果您看到可以改进或更惯用地处理的任何东西,请让我知道。

最新更新