【问题标题】:Add a shell function to the stdenv based on attribute根据属性向 stdenv 添加一个 shell 函数
【发布时间】:2019-10-03 03:18:14
【问题描述】:

有没有一种简单的方法可以在 stdenv 提供的环境中添加一个 bash 函数?使用“nix-shell”进行开发时,我可以运行“unpackPhase”或“buildPhase”之类的命令,因为mkDerivation 将它们置于作用域内——它非常有用。我的派生属性也被添加到环境中。但我也希望看到一种在构建/外壳环境中自动添加属性作为函数的方法。

为了解释我的意思,我目前可以使用eval 语句或toFilesource 将函数导入环境。例如,eval,类似于:

{ stdenv, ... } : stdenv.mkDerivation
{ shellHook = ''eval "$myFunctions"'';
  myFunctions = ''
    myFunction1(){
      echo "doing myFunction1"
      }
    myFunction2(){
      echo "doing myFunction2"
      }
    ''
}

当我输入 nix-shell 时,将“来源”myFunction1myFunction2

但是,我期待像 mkFunction 这样的实用程序来补充 mkWrappermkProgram 和其他此类基本实用程序。我希望像下面那样使用它,其中使用mkFunction 定义的属性会自动“源化”如上。

{ stdenv, mkFunction, ... } : stdenv.mkDerivation
{ myFunction1 = mkFunction '' echo "doing myFunction1" '';
  myFunction2 = mkFunction '' echo "doing myFunction2" '';
  shellHook = '' echo "No need to source, myFunctions are already in scope." '';
}

我认为这样的实用程序会很有用。我认为setup hooks 可能会涵盖此用途,但我不确定如何使用它们。第一种方式做起来还不错(如果我在写这个问题的过程中没有弄清楚,我就不会费心问了)。但似乎nix 已经提供了那种实用程序,所以我还是要问。

【问题讨论】:

    标签: nix


    【解决方案1】:

    Setup hooks 确实可以做到这一点,这里有一个简单的例子,它定义了一个函数foo

    with import <nixpkgs> {};
    let
      fooHook = stdenv.mkDerivation {
        name = "foo-hook";
        # Setting phases directly is usually discouraged, but in this case we really
        # only need fixupPhase because that's what installs setup hooks
        phases = [ "fixupPhase" ];
        setupHook = writeText "my-setup-hook" ''
          foo() { echo "Foo was called!"; }
        '';
      };
    in mkShell {
      buildInputs = [ fooHook ];
      shellHook = "foo";
    }
    

    在此运行 nix-shell 会产生所需的结果:

    $ nix-shell
    Foo was called!
    [nix-shell:~]$
    

    【讨论】:

      【解决方案2】:

      另一种简单的可能性是使用stdenv提供的runHook函数。

      with import <nixpkgs> {};
      mkShell rec {
        name = "runs-hook";
        myFun = "echo The name is ${name}";
      }
      

      在上面的 sn-p 中,变量 myFun 在 shell/build 环境中可用。你调用它:

      > runHook myFun
      The name is runs-hook
      

      这与问题中的eval 方法非常相似。

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 2023-03-15
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多