如何正确使用nix-shell并避免"倾倒非常大的路径"?

时间:2016-09-07 14:08:06

标签: ocaml nix

根据我的阅读材料(特别是the wikithis blog post),我提出了default.nix加载nix-shell的{​​{1}}:

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

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

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

(其中lib来自Nixpkgs)。

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

答案 1 :(得分:2)

晚了聚会,但是(由于我无法评论niksnutcorrect answer),如果您想添加{{1 }}到Nix存储,过滤掉大/不需要的文件。

此方法使用src中的lib.cleanSource and friends

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)和{{ 1}},cleanVendor,以.git结尾的文件以及其他与编辑器/ VCS相关的内容(.svn)。

请查看lib/sources.nix,以获取更多过滤路径的方法。