如何使用 nix 更改 var env 值

如何使用 nix 更改 var env 值

这是我的default.nix:

with import <nixpkgs> {}; {
  cimgEnv = stdenv.mkDerivation {
  name = "cimgdev";
  buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost jdk gradle (opencv4.override { enableGtk2 = true; })];
};
environment.variables = rec {
  LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/nix/store/j71chi4b06bh8rpd5611d6q8asrwf9z6-opencv-4.7.0/lib/";
};
}

但是当 nix-shell 之后我做了一个 echo $LD_LIBRARY_PATH

我什么都没有,只是一个空字符串

问候

答案1

您可能想要的是这样的default.nix

let
  pkgs = import <nixpkgs> {};
  opencv4 = pkgs.opencv4.override {enableGtk2 = true;};
in
  pkgs.stdenv.mkDerivation {
    name = "cimgdev";
    buildInputs = with pkgs; [pkgconfig stdenv cimg xorg.libX11 boost jdk gradle opencv4];
    shellHook = ''
      export LD_LIBRARY_PATH="${opencv4}/lib:$LD_LIBRARY_PATH"
    '';
  }

如果你想知道为什么这有效,但您的代码无效,请继续阅读:

Nix 中的派生本质上只是一组指令,它告诉 Nix 如何构建包。派生由名称、在构建过程中运行的构建器以及可以构建它的系统组成。它还可能包含任何其他属性,这些属性作为环境变量传递给构建器。

nix-shell接受派生( indefault.nixshell.nix)作为输入,并以与调用构建器相同的方式运行交互式 shell,因此所有属性都作为环境变量公开。shellHook在运行 shell 之前,它还会读取并执行其中的命令。

我们不能LD_LIBRARY_PATH在没有 a 的情况下直接设置的原因shellHook是它会覆盖任何以前的值,而不是添加到它。

我还更改了您的代码以引用opencv4其中的包LD_LIBRARY_PATH(使用您的覆盖),而不是直接引用存储路径,因为使用您的方法,如果包(或其依赖项之一)更新,它就会中断。

相关内容