haskell - 如何编写一个结合其他 nix-shell 环境的 shell.nix 文件?
问题描述
我想编写一个shell.nix
文件,为我提供一个开发环境,其中包括开发人员工具 + haskell 依赖项。我想将我的 nix 表达式分开 - 现在这意味着一个文件包含有关我的编辑器的信息,另一个文件包含有关我的 haskell 项目的信息。
我试图建立一个非常基本的环境,但无法让它工作。我已经有两个文件可以创建一个nix-shell
:
# my-haskell-shell.nix - generated by cabal2nix --shell
{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:
let
inherit (nixpkgs) pkgs;
f = { mkDerivation, base, cabal-install, hpack, stdenv }:
mkDerivation {
pname = "hello-world";
version = "0.1.0.0";
src = ./.;
isLibrary = false;
isExecutable = true;
libraryToolDepends = [ hpack ];
executableHaskellDepends = [ base ];
executableToolDepends = [ cabal-install hpack ];
preConfigure = "hpack";
license = stdenv.lib.licenses.mit;
};
haskellPackages = if compiler == "default"
then pkgs.haskellPackages
else pkgs.haskell.packages.${compiler};
variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;
drv = variant (haskellPackages.callPackage f {});
in
if pkgs.lib.inNixShell then drv.env else drv
# my-neovim-shell.nix
with import <nixpkgs> {};
let
my-neovim = neovim.override { vimAlias = false; };
in
stdenv.mkDerivation {
name = "neovim-dev-env";
buildInputs = [
my-neovim
];
}
这两者都产生了有用的 shell 环境!(也就是说,nix-shell my-haskell-env.nix
分别nix-shell my-neovim-env.nix
给我 cabal 和 neovim,但不能同时给我)。
我尝试制作一个shell.nix
可以同时提供 neovim 和 cabal 的环境是这样的:
# shell.nix
with import <nixpkgs> {};
let
my-neovim-shell-env = import ./my-neovim-shell.nix;
my-haskell-shell-env = import ./my-haskell-shell.nix {};
in
stdenv.mkDerivation {
name = "my-new-env";
buildInputs = [
my-neovim-shell-env
my-haskell-shell-env
];
}
然而,这不起作用。好像在尝试搭建neovim环境:
$ nix-shell
these derivations will be built:
/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv
building '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv'...
unpacking sources
variable $src or $srcs should point to the source
builder for '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv' failed with exit code 1
error: build of '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv' failed
我不知道如何解决这个问题;我究竟做错了什么?我怀疑也许我不应该使用 mkDerivation?
解决方案
设法找到解决方案。也许有更好的方法,但这有效:
假设你有一个 package.yaml,那么
$ cabal2nix . > app.nix
# shell.nix
let
p = import <nixpkgs> {};
app = p.haskellPackages.callPackage (./app.nix) {};
lib = p.haskell.lib;
in
lib.overrideCabal app (old: { buildTools = [p.my-nvim] ++ (old.buildTools or []); })
(我添加my-nvim
到我的地方~/.config/nixpkgs/overlays/
)
现在我可以访问 my-nvim 包和ghc 等:
$ nix-shell
$ nvim # works
$ ghc # works
推荐阅读
- laravel - laravel 控制台中的错误请求状态消息
- javascript - 处理大量数据的最佳方法
- r - 避免嵌套列表的嵌套 for 循环
- javascript - 接口类型的数组
- c# - 使用 HtmlAgilityPack 进行 Web 查询抛出 System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道
- typescript - 如何从格式为“08/01/2018”的日期减少 1 年?
- java - 更新 Spinner 失去了它的风格
- php - Wordpress - 从自定义帖子类型中获取自定义字段
- asp.net - 如何在asp.net的gridview中获取复选框值
- java - Evaluator 类导入没有进入 ignite-ml 依赖项?