我正在打包以下派生。
- 一个名为的 C++ 库
amazing
,它具有仅标头的 C++ 依赖项(此示例为nlohmann_json)。库必须是动态的(共享 ELF 文件)。该amazing
库nlohmann_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
以便使用的派生amazing
在nlohmann_json
构建时具有但不强制nlohmann_json
在最终容器中存在(propagatedNativeBuildInputs
来自depsBuildBuildPropagated
nixpkgs手册),但我无法达到预期的结果。我也尝试使用strictDeps = true;
,但在这种情况下我无法构建我的派生。
是否有可能用 Nix 实现我想要的?