我正在使用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
来自定义配置路径的方法。所以我正在考虑这样做:
-
创建一个表达式,用于在$ out下安装文件。
-
创建一个安装鱼并使用低音作为构建输入的表达式。使用
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
)。
如果您看到可以改进或更惯用地处理的任何东西,请让我知道。