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포크(in default.nix또는 shell.nix)를 입력으로 받아들이고 빌더 호출과 동일한 방식으로 대화형 셸을 실행하므로 모든 속성이 환경 변수로 노출됩니다. shellHook또한 실행하기 전에 셸에서 명령을 읽고 실행합니다.

LD_LIBRARY_PATHa 없이 직접 설정할 수 없는 이유 shellHook는 이전 값을 추가하는 것이 아니라 덮어쓰기 때문입니다.

opencv4또한 저장소 경로를 직접 참조하는 대신 (재정의를 사용하여) 그 안에 있는 패키지를 참조하도록 코드를 변경했습니다 LD_LIBRARY_PATH. 왜냐하면 귀하의 접근 방식을 사용하면 패키지(또는 해당 종속성 중 하나)가 업데이트되면 중단될 수 있기 때문입니다.

관련 정보