提问人:deadlock 提问时间:12/15/2021 更新时间:3/29/2022 访问量:358
Nix:在构建时传播依赖关系,而不是在运行时传播依赖关系?
Nix: Propagate dependency for build-time but NOT for run-time?
问:
我正在打包以下推导。
- 一个名为 C++ 库,该库具有仅标头C++依赖项(本示例为 nlohmann_json)。
库必须是动态的(共享的 ELF 文件)。
该库在构建时需要依赖项,但不需要运行时(仅标头)。
的用户在构建时也需要,否则会出现编译错误。
但用户在运行时不需要。
amazing
amazing
nlohmann_json
nlohmann_json
amazing
nlohmann_json
nlohmann_json
- 使用该库命名的 C++ 可执行文件。
example
amazing
- 一个名为 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
我尝试了几种方法来定义 的输入,以便
在构建时使用具有的派生,但不强制在最终容器中存在(来自 nixpkgs 手册),
但我无法达到预期的结果。
我也尝试使用,但在这种情况下我无法构建我的推导。nlohmann_json
amazing
amazing
nlohmann_json
nlohmann_json
propagatedNativeBuildInputs
depsBuildBuildPropagated
strictDeps = true;
Nix有没有可能实现我想要的?
答:
我没有一个完整的答案,但你可以看看(见这里)。这和是针对这种情况的。以下是我在使用中发现的几个示例。disallowedReferences
nixpkgs.removeReferenceTo
但是我搞砸了你的示例一段时间,在您的示例推导中使用了 / 和 remove-reference-to 的各种组合,以及将 .我无法让它工作。 总是被收录进来,否则梅森会抱怨找不到.因此,关于删除引用的内容最终会抛弃所有 .disallowedReferences
allowedReferences
nlohmann_json
amazing
nlohmann_json
amazing
nlohmann_json
amazing
在我看来,您想使用 propagatedNativeBuildInputs。有关文档,请参阅 https://github.com/NixOS/nixpkgs/blob/master/doc/stdenv/stdenv.chapter.md#propagatednativebuildinputs-var-stdenv-propagatednativebuildinputs。
评论