Nix 提升安装错过了标头



我通过 $ nix-env -i boost 使用 nix 包管理器安装了 boost,但在当前一代的配置文件中没有 boost 标头。

因此~/.nix-profile/include/boost不会退出,但可以在 ~/.nix-profile/lib 中找到 boost 库文件。

我在 nix 商店中搜索,并在商店内的boost-dev文件夹中找到了标题。

为什么 nix 不将提升标头链接到我的当前一代?

boost 包是一个拆分包,因此它具有多个输出。

$ nix-instantiate --eval -E '(import <nixpkgs> {}).boost.outputs'
[ "out" "dev" ]

在这种情况下,out输出具有库,dev输出具有标头。通常,当您使用 nix-env -i 时,dev输出不会安装到用户环境中。但是,当包是另一个包的生成依赖项时,它会在内部使用。

您可以看到将像这样安装哪些输出:

$ nix-instantiate --eval -E 'builtins.toString (import <nixpkgs> {}).boost.meta.outputsToInstall'
"out"

文档指示,如果需要其他输出,可以覆盖meta.outputsToInstall

我最好的尝试是:

nix-env -i -E 
  '_: with import <nixpkgs> {};' 
  'let newmeta = ( boost.meta // { outputsToInstall = ["out" "dev"]; } );' 
  'in boost // { meta = newmeta; }'

有兴趣听到一个不那么麻烦的版本......

我怀疑真正的答案是,我们不应该试图将开发的东西安装到用户环境中。也许最好编写一个定义开发依赖项的default.nix文件,并使用nix-shell实例化它。例如,请参阅 https://garbas.si/2015/reproducible-development-environments.html。

相关内容

最新更新