12

根据我的阅读资料(特别是 wiki这篇博文),我想出了以下default.nix我加载的内容nix-shell

with import <nixpkgs> {};

let emacs =
  emacsWithPackages (p : [ p.tuareg ]);
in

stdenv.mkDerivation rec {
    name = "env";

    src = ./.;

    # Customizable development requirements
    buildInputs = [
        pkgconfig
        ocaml
        ocamlPackages.merlin
        ocamlPackages.findlib
        ocamlPackages.lablgtk
        ocamlPackages.camlp5_transitional
        ncurses
        emacs
    ];

    # Customizable development shell setup
    shellHook = ''
        export PATH=`pwd`/bin:$PATH
    '';
}

但它总是打印一个警告:

warning: dumping very large path (> 256 MiB); this may run out of memory

并且需要很长时间才能加载(启动后第一次调用大约 45 秒nix-shell,后续调用大约 2 秒)。

这条消息的含义是什么?当我在 Google 上查找它时,我发现了一些 GitHub 问题,但没有以外行人易于理解的方式表达。

我可以加快加载速度并删除此消息吗?在我看来,我做错了什么。

是否有关于编写这种我可能不知道的开发环境的一般建议?

4

2 回答 2

12

可能src属性(当前目录)很大。nix-shell将在每次调用时将其复制到 Nix 商店,这可能不是您想要/需要的。解决方法是写:

src = if lib.inNixShell then null else ./.;

lib来自 Nixpkgs)。

这样,./.将在您调用时复制nix-build,但在您运行时不会复制nix-shell

于 2016-09-14T14:41:38.760 回答
6

派对迟到了,但是(因为我无法评论niksnut正确答案src)如果您想向Nix 商店添加一些子集,过滤掉大/不需要的文件, 我想提一下处理这个问题的方法。

这种方法使用lib.cleanSource和朋友来自nixpkgs

# shell.nix
{ pkgs ? import <nixpkgs> {} }:

with pkgs;

let
  cleanVendorFilter = name: type: 
    type == "directory" && baseNameOf (toString name) == "vendor";
  cleanVendor = src: lib.cleanSourceWith { filter = cleanVendorFilter; inherit src; };
  shellSrc = lib.cleanSource (cleanVendor ./.);
in mkShell {
  name = "my-shell";
  shellHook = ''
    printf 1>&2 '# Hello from store path %s!\n' ${shellSrc}
  '';
}

在上面的代码片段中,shellSrc指的是表示存储路径的属性集,其中包含./.但不包含vendor子目录 ( cleanVendor) 且不包含.git, .svn、以 结尾的文件~以及其他与编辑器/VCS 相关的内容 ( cleanSource)。

查看lib/sources.nix了解更多过滤路径的方法。

于 2019-08-13T14:57:40.373 回答