nix-shell:如何指定自定义环境变量?

mon*_*onk 5 nixos

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

我知道有几种写nix表达式文件的方法(我还不习惯大多数方法)。这是我的样本:

shell.nix

let 
  pkgs = import <nixpkgs> {};
  name = "test";
in pkgs.myEnvFun {
  buildInputs = [
    pkgs.python
    pkgs.libxml2
  ];
  inherit name;
  extraCmds = ''
    export TEST="ABC"
  '';
 }
Run Code Online (Sandbox Code Playgroud)

iEl*_*ric 6

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

with import <nixpkgs> {};

buildPythonPackage {
  name = "test";

  buildInputs = [ pkgs.python pkgs.libxml2 ];

  src = null;

  PGDATA = "...";
}
Run Code Online (Sandbox Code Playgroud)


kra*_*mir 6

要为 nix-shell 设置环境变量而不创建新包,shellHook可以使用选项。如手册中的示例所示

shellHook =
  ''
    echo "Hello shell"
    export SOME_API_TOKEN="$(cat ~/.config/some-app/api-token)"
  '';
Run Code Online (Sandbox Code Playgroud)

shell.nix基于我的用例的完整示例 -go来自不稳定通道的版本 1.18:

let
  pkgs = import <nixpkgs> {};

  unstable = import <nixos-unstable> { config = { allowUnfree = true; }; };

in pkgs.mkShell rec {
  name = "go-1.18";

  buildInputs = with pkgs; [
    unstable.go_1_18
  ];

  shellHook = ''
    export PATH="$HOME/go/bin:$PATH"
  '';
}
Run Code Online (Sandbox Code Playgroud)

该脚本还设置 name 选项,该选项随后显示在 shell 提示符中(与Starship shell 提示符配合良好)。


Abd*_*lah 5

您也可以使用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"
  '';
 }
Run Code Online (Sandbox Code Playgroud)