首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写结合其他nix环境的shell.nix文件?

如何编写结合其他nix环境的shell.nix文件?
EN

Stack Overflow用户
提问于 2019-01-20 16:08:44
回答 1查看 1.7K关注 0票数 3

我想编写一个shell.nix文件,它将为我提供一个开发环境,其中包括开发工具+ haskell依赖项。我想保持我的nix表达式分开--现在这意味着一个文件包含关于我的编辑器的信息,一个文件包含关于我的haskell项目的信息。

我试着建立一个非常基本的环境,但无法让它发挥作用。我已经有两个文件可以创建一个nix-shell

代码语言:javascript
复制
# 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
代码语言:javascript
复制
# 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.nixnix-shell my-neovim-env.nix分别给了我阴谋和新生,但不是两者兼而有之)。

我试图生产一个shell.nix,它将提供一个新的和可利用的环境,它是这样的:

代码语言:javascript
复制
# 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
  ];
}

然而,这是行不通的。它似乎试图建立新的环境:

代码语言:javascript
复制
 $ 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?

EN

回答 1

Stack Overflow用户

发布于 2019-01-20 20:23:34

设法找到了解决办法。也许有更好的方法,但这是可行的:

那么,假设您有一个package.yaml

代码语言:javascript
复制
 $ cabal2nix . > app.nix
代码语言:javascript
复制
# 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 []); })

(我在~/.config/nixpkgs/overlays/中添加了~/.config/nixpkgs/overlays/)

现在我可以访问my软件包和ghc,等等:

代码语言:javascript
复制
$ nix-shell

$ nvim # works
$ ghc # works

https://github.com/p-implies-q/nix-util的启示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54278327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档