我基本上想创建我自己的简单版本的
mkShell
,所以现在我试图了解如何在 shell 实际弹出之前执行一些代码。我用谷歌搜索了一下,然后想到了这个:
let pkgs = import <nixpkgs> {}; in
derivation {
name = "hello";
shellHook = ''
echo "hello world!"
'';
system = builtins.currentSystem;
builder = "${pkgs.bash}/bin/bash";
args = [ ./setup.sh ];
}
来自 nix-shell 文档:
如果派生定义了变量 shellHook,它将在获取 $stdenv/setup 后运行。由于此钩子不是由常规 Nix 构建执行的,因此它允许您执行特定于 nix-shell 的初始化。例如,推导属性
shellHook =
''
echo "Hello shell"
export SOME_API_TOKEN="$(cat ~/.config/some-app/api-token)"
'';
但这不会输出任何内容,尽管如果我将
derivation {}
替换为 pkgs.mkShell {}
,那么它就会输出任何内容。我怎样才能在不实际使用 pkgs.mkShell
的情况下使这种行为发挥作用?
我无法重现所述问题。作为一个工作示例,创建以下
flake.nix
后:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
in {
devShells = {
exampleDevShell = derivation {
inherit system;
name = "so-question-77656854";
builder = "${pkgs.bash}/bin/bash";
args = [ "-c" ''touch "$out"'' ];
outputs = [ "out" ];
shellHook = ''
echo "Hello, world"
'';
};
};
});
}
...运行
nix develop .#exampleDevShell
将 Hello, world
打印到标准输出。