Как написать файл shell.nix, который объединяет другие среды nix-оболочки? - PullRequest
0 голосов
/ 20 января 2019

Я хочу написать файл 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
  ];
}

Оба они создают полезную оболочку! (То есть, nix-shell my-haskell-env.nix и nix-shell my-neovim-env.nix дают мне клику и неовима соответственно, но не оба).

Моя попытка создать 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?

1 Ответ

0 голосов
/ 20 января 2019

удалось найти решение.Может быть, есть лучший способ, но это работает:

Предположим, у вас есть 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

Вдохновение от https://github.com/p-implies-q/nix-util

...