【发布时间】: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 在容器中。
我尝试了几种方法来定义amazing 的nlohmann_json 输入,以便
使用amazing 的派生在构建时具有nlohmann_json,但不强制在最终容器中存在nlohmann_json(propagatedNativeBuildInputs、depsBuildBuildPropagated 来自nixpkgs manual),
但我无法达到预期的效果。
我也尝试使用strictDeps = true;,但在这种情况下我无法构建我的派生。
是否可以通过 Nix 实现我想要的?
【问题讨论】:
标签: docker nix header-only