如何制作一个仅使用内置推导函数来运行一些代码的 shell.nix?

问题描述 投票:0回答:1

我基本上想创建我自己的简单版本的

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
的情况下使这种行为发挥作用?

nix nixos
1个回答
0
投票

我无法重现所述问题。作为一个工作示例,创建以下

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
打印到标准输出。

© www.soinside.com 2019 - 2024. All rights reserved.