【问题标题】:Forbid runtime dependency on package in Nix overlay在 Nix 覆盖中禁止运行时依赖包
【发布时间】:2019-12-25 18:31:08
【问题描述】:

任务描述

我想确保我安装的任何派生都没有运行时依赖于指定的派生集。如果我要求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% 的解决方案。

【问题讨论】:

    标签: package-managers nix dependency-resolution


    【解决方案1】:

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

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

    所以,如果你把你想要的所有派生放在“世界”中,你可以确定evilugly 不在依赖项中。但是它们将被下载到存储中以构建“世界”,即使它们实际上并未被paths 中的任何派生使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2016-04-18
      • 2021-09-20
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多