1

我正在打包以下派生。

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

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

是否有可能用 Nix 实现我想要的?

4

1 回答 1

1

我没有完整的答案,但你可以看看disallowedReferences(见这里)。这nixpkgs.removeReferenceTo适用于这种情况。这是我在使用中发现的几个示例

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

于 2021-12-16T03:09:14.650 回答