我在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
来自定义配置路径的方法。所以我想做这样的事情:
为Bass修补Makefile创建一个表达式,以便在$ out下安装文件。
创建一个安装fish并使用Bass作为构建输入的表达式。使用wrapProgram
将XDG_CONFIG_HOME
设置为指向nix-store中的Bass安装路径。
这听起来像是正确的做法吗?是否有其他/更好的方法来解决这个问题?
由于
答案 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
)的任何其他用户定义的函数。
如果您发现任何可以改进或处理的内容,请告诉我。