Как написать файл shell.nix, который объединяет другие среды 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
];
}
Оба из них создают полезные оболочки! (То есть, nix-shell my-haskell-env.nix
а также nix-shell my-neovim-env.nix
дай мне клику и неовим соответственно, но не оба).
Моя попытка произвести shell.nix
что обеспечит среду как с neovim, так и с кабалой:
# 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 ответ
Удалось найти решение. Может быть, есть лучший способ, но это работает:
Предположим, у вас есть 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