我正在学习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)
使用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)
要为 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 提示符配合良好)。
您也可以使用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)
| 归档时间: |
|
| 查看次数: |
4124 次 |
| 最近记录: |