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

时间:2017-12-27 14:12:05

标签: nix

我在macOS(Sierra)上使用nix package-manager。

我的目的是编写一个nix表达式,它将安装现有的fish nix包以及Bass fish插件。

在Bass的nixpkgs中没有现有的表达式,但git repo包含Makefile。此Makefile尝试将文件复制到$HOME目录。这是一个问题,因为在nix-store之外安装文件显然是不可取的,并且在构建我的包时没有设置$HOME

我可以理解为什么nix软件包不能在nix-store之外安装文件 - 在函数式编程术语中它类似于副作用。但我也不清楚如何解决我的问题:

默认情况下,Fish需要在$HOME/.config/fish/下安装Bass等插件。 Fish确实提供了一种通过指定环境变量XDG_CONFIG_HOME来自定义配置路径的方法。所以我想做这样的事情:

  1. 为Bass修补Makefile创建一个表达式,以便在$ out下安装文件。

  2. 创建一个安装fish并使用Bass作为构建输入的表达式。使用wrapProgramXDG_CONFIG_HOME设置为指向nix-store中的Bass安装路径。

  3. 这听起来像是正确的做法吗?是否有其他/更好的方法来解决这个问题?

    由于

1 个答案:

答案 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-store中。这使我们能够对Bass中的函数进行符号链接,并复制来自本地$src目录的任何其他配置文件。其他插件可以以相同的方式进行符号链接。

派生的本地src目录包含以下文件:

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

.config/fish/fishd.8c8590486f8c文件是Fish需要的“通用变量文件”才能运行。在标准Fish安装中,此文件存储在~/config/fish/下,并在您第一次进入交互模式时创建。当用户与Fish设置进行交互时,此文件的内容通常会随时间而变化。

fish_with_config派生将Fish配置存储在nix-store中,这意味着它不能在后一个日期修改(不可写)。这意味着所有配置设置都需要提前完成,因为用户修改设置的任何尝试都会导致权限错误 - 这显然有点不方便,但对我来说不是一个显示限制。

值得注意的是,通用变量文件可能会随着Fish的不同版本而发生变化,因此如果我要使用较新版本的Fish构建fish_with_config,我首先会通过运行fish来确定它的默认内容。 nix-shell并检查~/config/fish/下的自动生成的文件。

总之,上面的工作很顺利,我可以访问bass以及我选择“烘焙”(pkgs/fish_with_config/.config/fish/functions)的任何其他用户定义的函数。

如果您发现任何可以改进或处理的内容,请告诉我。

相关问题