根据我的阅读材料(特别是the wiki和this 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问题,但没有以一种易于理解的方式表达。
我可以加快加载并删除此消息吗?在我看来,我做错了什么。
是否有关于编写我可能不知道的这种开发环境的一般性建议?
答案 0 :(得分:9)
可能src
属性(当前目录)非常大。 nix-shell
会在每次调用时将其复制到Nix商店,这可能不是您想要/需要的。解决方法是写:
src = if lib.inNixShell then null else ./.;
(其中lib
来自Nixpkgs)。
这样,./.
会在您调用nix-build
时被复制,但在您运行nix-shell
时则不会被复制。
答案 1 :(得分:2)
晚了聚会,但是(由于我无法评论niksnut的correct 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,以获取更多过滤路径的方法。