Nix:在构建时传播依赖关系,而不是在运行时传播依赖关系?

Nix: Propagate dependency for build-time but NOT for run-time?

提问人:deadlock 提问时间:12/15/2021 更新时间:3/29/2022 访问量:358

问:

我正在打包以下推导。

  • 一个名为 C++ 库,该库具有仅标头C++依赖项(本示例为 nlohmann_json)。 库必须是动态的(共享的 ELF 文件)。 该库在构建时需要依赖项,但不需要运行时(仅标头)。 的用户在构建时也需要,否则会出现编译错误。 但用户在运行时不需要。amazingamazingnlohmann_jsonnlohmann_jsonamazingnlohmann_jsonnlohmann_json
  • 使用该库命名的 C++ 可执行文件。exampleamazing
  • 一个名为 docker 容器,它只包装了 的编译版本。 我希望容器包含所有需要的运行时依赖项,但保持最小 - 即,它不应该包含.example-dockerexampleexamplenlohmann_json

我为这个例子创建了一个独立的最小 git 存储库

我当前的 Nix 设置如下所示。

{ pkgs ? import (fetchTarball {
    url = "https://github.com/NixOS/nixpkgs/archive/21.11.tar.gz";
    sha256 = "162dywda2dvfj1248afxc45kcrg83appjd0nmdb541hl7rnncf02";
  }) {}
}:

let
  self = rec {
    nlohmann_json = pkgs.nlohmann_json;
    amazing = pkgs.stdenv.mkDerivation rec {
      pname = "amazing";
      version = "local";
      src = pkgs.lib.sourceByRegex ./lib [
        "amazing\..pp"
        "meson\.build"
      ];
      nativeBuildInputs = with pkgs; [ meson ninja pkgconfig ];
      propagatedBuildInputs = [ nlohmann_json ];
    };
    example = pkgs.stdenv.mkDerivation rec {
      pname = "example";
      version = "local";
      src = pkgs.lib.sourceByRegex ./example [
        "example\.cpp"
        "meson\.build"
      ];
      nativeBuildInputs = with pkgs; [ meson ninja pkgconfig amazing ];
    };
    example-docker = pkgs.dockerTools.buildImage {
      name = "example";
      tag = "latest";
      contents = [ example ];
      config = {
        Entrypoint = [ "${example}/bin/example" ];
      };
    };
  };
in
  self

Nix 设置有效(所有派生都正确构建并且容器运行良好), 但容器不是最小的:在容器中。nlohmann_json

我尝试了几种方法来定义 的输入,以便 在构建时使用具有的派生,但不强制在最终容器中存在(来自 nixpkgs 手册), 但我无法达到预期的结果。 我也尝试使用,但在这种情况下我无法构建我的推导。nlohmann_jsonamazingamazingnlohmann_jsonnlohmann_jsonpropagatedNativeBuildInputsdepsBuildBuildPropagatedstrictDeps = true;

Nix有没有可能实现我想要的?

仅 Docker Nix 标头

评论


答:

1赞 Nathan Saritzky 12/16/2021 #1

我没有一个完整的答案,但你可以看看(见这里)。这和是针对这种情况的。以下是我在使用中发现的几个示例disallowedReferencesnixpkgs.removeReferenceTo

但是我搞砸了你的示例一段时间,在您的示例推导中使用了 / 和 remove-reference-to 的各种组合,以及将 .我无法让它工作。 总是被收录进来,否则梅森会抱怨找不到.因此,关于删除引用的内容最终会抛弃所有 .disallowedReferencesallowedReferencesnlohmann_jsonamazingnlohmann_jsonamazingnlohmann_jsonamazing

0赞 SuperSandro2000 3/29/2022 #2

在我看来,您想使用 propagatedNativeBuildInputs。有关文档,请参阅 https://github.com/NixOS/nixpkgs/blob/master/doc/stdenv/stdenv.chapter.md#propagatednativebuildinputs-var-stdenv-propagatednativebuildinputs