在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
来自定义配置路径的方法。所以我正在考虑做这样的事情:
创建一个表达式,用来修补Makefile以安装$ out下的文件。
创建一个表达式来安装鱼,并使用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