【问题标题】:nix-shell: how to specify a custom environment variable?nix-shell:如何指定自定义环境变量?
【发布时间】:2015-02-27 02:31:54
【问题描述】:

我正在学习 nixos 和 nix 表达式。在一个项目文件夹中,我创建了一个 shell.nix,当我运行 nix-shell 时,我希望它为我预设一个环境变量。 例如设置 PGDATA 环境变量。

我知道有几种方法可以编写 nix 表达式文件(其中大部分我还不习惯)。这是我的示例:

shell.nix

let 
  pkgs = import <nixpkgs> {};
  name = "test";
in pkgs.myEnvFun {
  buildInputs = [
    pkgs.python
    pkgs.libxml2
  ];
  inherit name;
  extraCmds = ''
    export TEST="ABC"
  '';
 }

【问题讨论】:

    标签: nixos


    【解决方案1】:

    您也可以使用pkgs.stdenv.mkDerivation.shellHook

    let 
      pkgs = import <nixpkgs> {};
      name = "test";
    in pkgs.stdenv.mkDerivation {
      buildInputs = [
        pkgs.python
        pkgs.libxml2
      ];
      inherit name;
      shellHook = ''
        export TEST="ABC"
      '';
     }
    

    【讨论】:

    • nix-build 不调用 shellHook,是吗?
    • 不,它只在 nix-shell 上调用。如果您需要在构建脚本上修改 env var,只需添加/覆盖特定阶段nixos.org/manual/nixpkgs/stable/#build-phase
    • 如果使用覆盖,如何覆盖相位?
    • 您正在修改现有派生?因为我上面的意思是覆盖默认的 mkDerivation 构建阶段,它只是make。如果是这种情况,我不确定,但覆盖应该像往常一样。您应该参考一种覆盖现有派生的方法。
    【解决方案2】:

    使用 buildPythonPackage 函数(使用 mkDerivation)。向它传递任何东西都会在 bash shell 中设置环境变量:

    with import <nixpkgs> {};
    
    buildPythonPackage {
      name = "test";
    
      buildInputs = [ pkgs.python pkgs.libxml2 ];
    
      src = null;
    
      PGDATA = "...";
    }
    

    【讨论】:

    • 感谢您的建议。我在示例中使用 python 仅作为示例。我通常将它用于 haskell 项目。我想我也可以在我的 haskell 项目中使用这个功能,虽然看起来有点奇怪。为什么在 buildPythonPackage 中有效但在 myEnvFun 中无效?这是 myEnvFun 的错误(或功能请求)吗?
    • myEnvFun 不是一个包,构建一个构建环境。它不适用于 nix-shell。
    • 如果您使用stdenv.mkDerivation 函数,您似乎可以使用shellHook 来执行此操作。
    • 我想知道虽然通过属性设置环境变量适用于nix-shell,但在构建buildPythonPackagebuildPythonApplication 时它如何与nix-build 交互?那是当您构建实际输出时,您希望所有脚本(由setup.py 指定)在执行时设置该环境变量?肯定不是在所有事情上都使用makeWrapper 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2022-09-28
    • 2022-11-08
    相关资源
    最近更新 更多