【问题标题】:Nix: Propagate dependency for build-time but NOT for run-time?Nix:传播依赖于构建时而不是运行时?
【发布时间】:2022-01-18 02:54:19
【问题描述】:

我正在打包以下派生。

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

我为此示例创建了self-contained minimal git repository

我当前的 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 在容器中。

我尝试了几种方法来定义amazingnlohmann_json 输入,以便 使用amazing 的派生在构建时具有nlohmann_json,但不强制在最终容器中存在nlohmann_jsonpropagatedNativeBuildInputsdepsBuildBuildPropagated 来自nixpkgs manual), 但我无法达到预期的效果。 我也尝试使用strictDeps = true;,但在这种情况下我无法构建我的派生。

是否可以通过 Nix 实现我想要的?

【问题讨论】:

    标签: docker nix header-only


    【解决方案1】:

    我没有完整的答案,但您可以查看disallowedReferences(请参阅here)。这和nixpkgs.removeReferenceTo 是针对这种情况的。这是我在使用中发现的examples 中的couple

    但是我在您的示例推导中使用了 disallowedReferences/allowedReferences 和 remove-reference-to 的各种组合,以及将 nlohmann_json 放在 @987654329 的依赖项中的各个位置@。我无法让它工作。 nlohmann_json 总是包含在内,否则 Meson 会抱怨它找不到 amazing。因此,删除对nlohmann_json 的引用最终会丢弃所有amazing

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多