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.nixまたはshell.nix)を入力として受け入れ、Builder呼び出しと同じ方法で対話型シェルを実行するので、すべてのプロパティが環境変数として公開されます。shellHookまた、実行する前にシェルからコマンドを読み込んで実行します。

LD_LIBRARY_PATHaなしで直接設定できないのは、shellHook古い値を追加するのではなく上書きするためです。

opencv4また、リポジトリパスを直接参照する代わりに(オーバーライドを使用して)その中のパッケージを参照するようにコードを変更しましたLD_LIBRARY_PATH。なぜなら、あなたのアプローチを使用すると、パッケージ(またはその依存関係の1つ)が更新されると中断される可能性があります。

おすすめ記事