1

任务描述

我想确保我安装的任何派生都没有运行时依赖于指定的派生集。如果我要求nix-env安装具有这种运行时依赖性的软件包,我希望它说我要求不可能。构建依赖关系很好。不过,我想避免大规模的级联重建。

换句话说,我想确保派生name = evil永远不会到达我的 Nix 商店,但我很好,它被用来在 Hydra 上构建其他派生。这是我尝试过的:

尝试失败:使用派生meta属性

self: super: {
  evil = super.evil // { meta.broken = True; };
}

但这会nix-env拒绝安装在构建时依赖于 的程序evil,例如它拒绝安装gohaskell程序(静态链接),因为编译器对evil.

失败的尝试:evil用无害的东西代替

我写覆盖替换evil

self: super {
  evil = super.harmless; # e.g super.busybox
}

它会导致重大的级联重建。

随机想法

如果有函数,像这样:

self: super: {
  ghc = forget_about_dependencies_but_retain_hash_yes_I_know_what_I_Do [super.evil] super.ghc;
  # same for rustc, go and other compilers that link statically.
}

这对我来说是 90% 的解决方案。

4

1 回答 1

1

似乎不可能阻止某些派生存储,但可以确保配置文件不包含运行时依赖项:

self: super: {
   world = (super.buildEnv {
     name = "world";
     paths = with super; [ foo bar baz ];
   }).overrideAttrs (_: { disallowedRequisites = [ super.evil super.ugly ]; });
}

evil所以,如果你把所有你想要的推导放在“世界”中,你可以确定ugly它们不在依赖关系中。但是它们将被下载到存储中以构建“世界”,即使它们实际上并没有被paths.

于 2019-12-26T23:10:42.663 回答